SCHEDU page# 0001 next
2: COMMENT ⊗   VALID 00058 PAGES
3: C REC  PAGE   DESCRIPTION
4: C00001 00001
5: C00007 00002    BEGIN SCHEDU ↔ SUBTTL SCHEDULING ALGORITHM FOR SWAPPING SYSTEM
6: C00009 00003    NXTJOB DECREMENTS CURRENT JOB'S QUANT. AND PROTECT
7: C00012 00004    BUG TRAP
8: C00014 00005    CKJB1:  JUMPN   PID,SCHED
9: C00017 00006     SCAN JOB STATUS TABLES FOR A JOB TO RUN
10: C00019 00007     THIS ROUTINE CHECKS TO SEE IF THE JOB IN J IS REALLY RUNNABLE
11: C00021 00008     HERE WE SEE IF THIS JOB'S HIGH SEGMENT IS IN CORE
12: C00023 00009     AT THIS POINT, WE HAVE ALMOST DECIDED ON A JOB
13: C00024 00010    2-PROCESSOR ROUTINES TO INTERLOCK JOBS
14: C00026 00011     HERE, WE SORT THE RUN QUEUE INTO PRIORITY ORDER
15: C00030 00012     THIS ROUTINE CALCULATES THE VARIOUS JOB PRIORITIES
16: C00033 00013     CALCULATE ONE JOB'S NEW PRIORITY
17: C00039 00014     ADD UP THE SERVICES TO HIS VARIOUS RELATIVES
18: C00043 00015    QCSS    24 JULY 67
19: C00046 00016    QUEUE INITIALIZATION
20: C00048 00017    DELETES A JOB FROM ITS "SOURCE-Q", DETERMINES A "DEST-Q"
21: C00049 00018    CALLING SEQUENCE:
22: C00057 00019     JOB IS NOT RUNNING.  REQUEUE HIS SEGMENT IF NEEDED.
23: C00060 00020    SCANS THE QS RETURNING THE NUMBERS OF THE JOBS IN THE QS.
24: C00062 00021    ↑QSCAN: SKIPN QR,(DAT)  END OF SCAN TABLE?
25: C00064 00022    DEFINE X'(A),<
26: C00065 00023    CORRESPONDENCE TABLE BETWEEN JOB STATUS CODES AND QUEUE TRANSFER TABLES
27: C00067 00024    IFN FTSWAP,<
28: C00069 00025    HERE RESIDES ALL THE SWAP IN LIST CODE -- RPH 1/15/74
29: C00074 00026    SWAP    4 AUG 67
30: C00076 00027    ↑SWAP:  PUSH PDP,[SWPXIT]        MAKE SURE WE EXIT THROUGH HERE
31: C00078 00028     WE COME HERE TO FINISH A SWAPPING INPUT REQUEST
32: C00081 00029     HERE WE CONTINUE ANY SPW JOB THAT WAS ACTIVE AND GIVE SWAPIN INTS
33: C00085 00030     WE CLEAR JOB DATA AREA IF REQUIRED ALSO
34: C00086 00031    HERE WE CHECK ALL THE SWAPIN BITS
35: C00089 00032    CHECK IF UPPER WANTS IN
36: C00091 00033    HERE THERE'S A SWAPIN ERROR.
37: C00093 00034    ERROR AND NOT WRITE PROTECTED SEGMENT, OR LOWER.
38: C00095 00035     HERE WE CHECK THE NUMBER OF DDB'S HE HAS, ALSO REGENERATE JOB DATA AREA
39: C00098 00036     ROUTINE TO RELEASE A JOB'S SWAPPING BANDS (LIBRASCOPE ONLY)
40: C00099 00037     AND HERE IS WHERE WE GO TO FINISH A SWAP OUTPUT REQUEST
41: C00103 00038    SCAN FOR INPUT - LOOK FOR A JOB ON THE DISK WHICH OUGHT TO COME IN.
42: C00107 00039     "DEADUP" IS CALLED FROM NEAR SCNIN2, IF THE JOB TO BE SWAPPED IN IS AN
43: C00110 00040     THIS SENDS THE MESSAGE TO A DEADLOCKED LOWER
44: C00111 00041     HERE WE SEE IF JOB CAN EVER FIT. IF SO, TRY TO COMPACT CORE TO GET HIM IN
45: C00113 00042     HERE WE HAVE DETECTED A CORE DEADLOCK
46: C00115 00043     CLOCK REQUEST TIMES OUT IN 15-SOME-ODD-SECONDS AND COMES HERE:
47: C00117 00044            GCMAX - ROUTINE TO CALCULATE HOW MUCH CORE IS AVAILABLE FOR A
48: C00122 00045    SCAN FOR OUTPUT
49: C00126 00046    FORCE4: CAME J,SEGWAIT           IF WAITING FOR SEGMENT, MUST STAY IN
50: C00129 00047    OUTPUT A JOB
51: C00134 00048     ROUTINE TO ADD THIS JOB'S SIZE TO CURRENT TOTAL AND SEE IF WE
52: C00136 00049     ROUTINE TO DECREMENT REFERENCE TO THIS JOB'S UPPER, IF ANY
53: C00137 00050     ALL SWAP RETURNS THROUGH HERE
54: C00138 00051    INPUT A JOB
55: C00140 00052    XPAND SETS CONDITIONS TO GET MORE CORE FOR A JOB BY SWAPPING IT OUT
56: C00143 00053    SWPSER  4 AUG 67
57: C00146 00054     FAST-BAND SWAPPER . .  .
58: C00148 00055     HERE WE HAVE ENOUGH BANDS, SET UP CALL
59: C00150 00056     LIBRASCOPE INPUT ROUTINE
60: C00152 00057     LIBRASCOPE SWAPPING ERROR ROUTINES
61: C00153 00058    FIND A SERIES OF BLOCKS ON THE DISK TO SWAP ONTO. CALLED
62: C00155 ENDMK
63: C⊗;
    SCHEDU page# 0002 next  prev
65: BEGIN SCHEDUSUBTTL SCHEDULING ALGORITHM FOR SWAPPING SYSTEM
66: ;11 SEPT 67 REDESIGNED PERIODICALLY BY JAM (AND OTHERS)
67: 
68: 
69: ;AC'S
70: QJ←DDB          ;QJOB WORD
71: Q←PROG          ; QUEUE NUMBER
72: PC←UUO          ; PC ON QUEUE SCAN CALLS
73: QR←AC1          ; RESCAN ADDRESS ON QUEUE SCAN CALLS
74: 
75: ;INITIALIZE SCHEDULER  (CALLED FROM IOINI1 BEFORE ALL OTHER
76: ;       DEVICES ARE INITIALIZED)
77: 
78: 
79: NXTINI:
80: REPEAT 0,<
81:         SYNINI  JBTCSC
82:         MOVE    DDB,[XWD JBTOWN,JBTOWN+1]
83:         SETZM   JBTOWN
84:         BLT     DDB,JBTOWN+JOBN-1
85: >
86:         SETZM   SCHBEG          ;ZERO JOB PRIORITY STUFF
87:         MOVE    DDB,[XWD SCHBEG,SCHBEG+1]
88:         BLT     DDB,SCHEND
89:         MOVEI   DDB,MAXQ                ;MAXIMUM NUMBER OF QUEUES
90: NXTIN1: SETZM   AVALTB(DDB)             ;CLEAR SHARABLE DEVICE AVAIL. FLAGS
91:         SETOM   REQTAB(DDB)             ;SET SHARABLE DEVICE REQUEST COUNT
92:                                         ;TO -1,  I.E. NO JOB WAITING OR
93:                                         ;USING DEVICE OTHER THAN INITIALIZATION
94:         SOJGE   DDB,NXTIN1
95:         SETZM   SWPCNT                  ;CLEAR SWAPPER COUNT
96:         SETZM   SCHMQT                  ;WAKE SWAPPER UP THE FIRST TIME AROUND
97:         SETZM   QJOB
98:         MOVE    DDB,[XWD QJOB,QJOB+1]
99:         BLT     DDB,QJOB+JOBN-1
100: IFN FTSWAP,<
101:         PUSHJ   P,FBINI
102:         JRST    SWPINI
103: >
104: IFE FTSWAP,<POPJ P,>
    SCHEDU page# 0003 next  prev
106: ;NXTJOB DECREMENTS CURRENT JOB'S QUANT. AND PROTECT
107: ;TIMES AND REQUEUES IT IF QUANT. TIME GONE TO 0.
108: ;SERVICES ANY JOB REQUEUING REQUESTED AT OTHER PRIORITY
109: ;LEVELS THEN CALLS SHUFFLER,SWAPPER AND SCHEDULER
110: ;MAKES NO ASSUMPTIONS RE. ACS
111: ;RETURNS NEXT JOB TO RUN IN J.
112: 
113: 
114: NXTJOB:
115:         JUMPN PID,SCHD1         ;PDP-6 GETS TO RUN THE NULL JOB A LOT.
116: 
117: ; HERE, WE SEE IF CURRENT JOB IS RUNNABLE. IF IT IS, WE
118: ; SEE IF ITS QUANTUM TIME HAS RUN OUT. IF IT HAS, WE REQUEUE THE
119: ; JOB. IF NOT, WE LEAVE NOW
120: 
121: CKJB3:  SKIPN J,JOB(PID)        ;CURRENT JOB NO., IS IT NULL JOB?
122:         JRST CKJB1              ;YES,GO SEE IF OTHER JOBS NEED RESCHEDULING
123:         CONO PI,PIOFF           ;AVOID CONFUSION BETWEEN NEXT 2 INSTRS
124:         MOVE DAT,JOBQUE(J)      ;PICK UP HIS NEW QUEUE
125:         MOVMM DAT,JOBQUE(J)     ;STORE BACK POS (NO MORE INT NEEDED)
126:         CONO PI,PION
127:         MOVM DDB,DAT            ;GET POSITIVE FORM
128:         HLRZ IOS,JBTSTS(J)      ;GET JOB STATUS BITS AND CODES
129:         ANDCMI IOS,RUNMSK       ;MASK OUT DO NOT CARE BITS
130:         CAIE IOS,RUNABLE        ;IS CURRENT JOB RUNABLE?
131:         JRST CKJB10             ;NO, REQUE CURRENT JOB
132:         CAIE DDB,RUNQ           ; IS HE STILL RUNNABLE?
133:         CAIN DDB,TQ
134:         CAIA
135:         JRST CKJB10             ; NO. REQUE HIM.
136:         SKIPE TIMEF(PID)        ;YES, IS THIS A TIME INTERRUPT?
137:         SOSLE SCHMQT(PID)       ; YES, DO WE RUN THE SCHEDULER THIS TICK?
138:         CAIA                    ;  NO
139:         JRST CKJB9              ;  YES
140: IFN FTSWAP,<    SKIPE XJOB(J)   ; NO, THIS JOB EXPANDING?
141:         JRST CHKXJ1             ; YES, SCHEDULE TO GET SWAPPED OUT>
142:         LDB DDB,PSEGN           ; GOT AN UPPER?
143:         JUMPE DDB,CPOPJ         ; NO, FORGET IT
144: IFN FTSWAP,<    SKIPE XJOB(DDB) ;IS HIS UPPER SEGMENT EXPANDING?
145:         JRST CHKXJ3             ;  YES  >
146:         MOVE DDB,JBTSTS(DDB)    ;IS IT IN TRANSIT?
147:         TLNE DDB,SHF!SWP
148:         JRST CKJB2A             ; YES, SHUT THIS JOB OFF
149:         POPJ P,                 ;  NO
    SCHEDU page# 0004 next  prev
151: ;BUG TRAP
152: CHKXJB: SKIPE XJOB      ;THIS SHOULD BE SET.
153:         POPJ P,         ;ALL IS WELL
154:         AOS XJOB        ;GET IT TAKEN CARE OF.
155:         PUSHACS
156:         PUSHJ   P,DISJOB
157:         PUSHJ   P,DISMES
158:         ASCIZ   / XJOB(J) SET BUT NOT XJOB(0)
159: /
160:         POPACS
161:         POPJ P,
162: 
163: CHKXJ4: PUSH P,J
164:         MOVE J,DDB
165:         PUSHJ P,CHKXJB
166:         POP P,J
167:         POPJ P,
168: 
169: CHKXJ3: PUSHJ P,CHKXJ4
170:         JRST CKJB2A
171: 
172: CHKXJ1: PUSHJ P,CHKXJB
173:         JRST CKJB2A
174: 
175: CKJB9:  MOVEI DAT,QQMQT         ; RESET SCHEDULER WAIT TIME
176:         MOVEM DAT,SCHMQT(PID)
177:         AOS NTMOS               ; BUMP NUMBER OF TIME-OUTS
178:         CAIE DDB,TQ             ; IF IN TQ, WE HAVE TO REQUEUE THIS JOB
179:         JRST CKJB2A
180:         MOVEI   DDB,RUNQ        ; PUT HIM INTO STANDARD RUN QUEUE
181:         MOVEM   DDB,JOBQUE(J)   ;SAVE QUEUE CODE (POS SINCE INT TAKEN CARE OF HERE)
182:         SKIPA DAT,[-1,,QRUNW]
183: CKJB10:
184:         HRR DAT,QBITS(DDB)      ;GET ADR FROM POS CODE IN DDB, PRESERVE SIGN OF ORIG
185:         PUSHJ P,QXFER
186:         MOVE J,JOB(PID)
187: CKJB2A:
188: REPEAT 0,<
189:         PUSHJ P,JOBRLS          ;ARRIVE HERE TO TURN OFF A JOB
190: >
    SCHEDU page# 0005 next  prev
192: CKJB1:  JUMPN   PID,SCHED
193: CKJB2:  SETZ TAC1,
194:         CONO PI,PIOFF           ;MAKE SURE LIST STAYS HONEST
195:         SKIPN J,QJOB
196:         JRST CKJB4
197:         EXCH TAC1,(J)           ;GET LIST LINK AND ZERO THIS ENTRY
198:         HRRZM TAC1,QJOB         ;LINK HIM OUT
199:         CONO PI,PION
200:         SUBI J,QJOB             ;GET JOB NUMBER
201:         CONO PI,PIOFF           ;PROBABLY BETTER DUPLICATED THAN OFF TOO LONG
202:         MOVE DAT,JOBQUE(J)      ;NEW QUEUE, - => GEN INT IF ENABLED
203:         MOVMM DAT,JOBQUE(J)     ;INT NO LONGER NEEDED
204:         CONO PI,PION
205:         MOVM DDB,DAT            ;GET POS FORM
206:         HRR DAT,QBITS(DDB)      ;AND BITS (PRESERVE SIGN)
207:         PUSHJ P,QXFER           ;DO THE QXFER THING
208:         JRST CKJB2
209: 
210: CKJB4:  CONO PI,PION            ;TURN PI'S BACK ON
211:         MOVEI QJ,AVLNUM         ;CK AVAL FLAGS FOR SHAR. DEVS.
212: CKJB6:  SKIPN AVALTB(QJ)        ;FLAG=0?
213:         SOJGE QJ,CKJB6          ;YES - TRY NEXT ONE
214:         CAIGE QJ,MINQ           ;LESS THAN MIN. SHAR. DEV.Q?
215:         JRST CKJB7              ;YES. IGNORE.
216:         MOVN J,QJ               ;NO--GET 1ST JOB IN Q
217:         HRRE J,JBTQ(J)
218:         JUMPLE J,CKJB8          ;FINISHED Q?
219:         MOVNI DAT,RUNQ          ; REQUEUE HIM TO THE RUN QUEUE
220:         MOVEM DAT,JOBQUE(J)
221:         HRROI DAT,QRUNW         ;- SO INT CAN HAPPEN
222:         SETZM AVALTB(QJ)        ;CLEAR AVAL FLAG
223:         PUSHJ PDP,QXFER         ;REQUEUE THE JOB AND PUT IT IN
224:                                 ;PROCESSOR Q SO SCHEDULER WILL RUN IT
225: CKJB8:  SOJG QJ,CKJB6           ;CONTINUE IF ANY MORE FLAGS TO LOOK AT
226: CKJB7:                          ;NONE--GO SHUFFLE AND SWAP
227:         SKIPE INTREQ            ;BUT FIRST A WORD FROM OUR INTERRUPTS
228:         PUSHJ P,INTRUN          ;(QXFER MAY HAVE GENERATED INTS)
229: IFE FTSWAP,<    
230:         PUSHJ PDP,CHKSHF
231: >
232: IFN FTSWAP,<
233:         HGMAC(10)
234:         PUSHJ PDP,SWAP
235:         HGMAC(6)        >
    SCHEDU page# 0006 next  prev
237: ; SCAN JOB STATUS TABLES FOR A JOB TO RUN
238: 
239: SCHED:  AOS NSCHEDS             ; COUNT NUMBER OF TIMES THROUGH HERE
240:         MOVEI DAT,ALLRUNSCAN    ; SCAN TQ AND RUNQ ONLY
241:         JSP PC,QSCAN
242:         JRST SCHD1              ; NOBODY LEFT, RUN NULL JOB
243:         PUSH P,DAT              ; SAVE POINTER TO QUEUE SCAN LIST
244:         PUSHJ P,CHKJOB          ; IS HE REALLY RUNNABLE?
245:         JRST SCHPDR             ; NO, TRY NEXT GUY
246:         POP P,DAT
247:         JRST SCH1               ; YES, DO IT
248: 
249: SCHPDR: POP P,DAT
250: SCH2:   JRST (QR)
251: 
252: REPEAT 0,<                      ;FLUSH THIS
253: SCHSCN: MOVE J,JOB(PID)         ; START AT CURRENT JOB NUMBER MINUS ONE
254: SCHD2:  SOJG J,SCHD3            ; WRAP JOB 0 AROUND TO MAXIMUM LEGAL JOB NUMBER
255:         MOVEI J,JOBN-1
256: SCHD3:  PUSHJ P,CHKJOB          ; IS HE REALLY RUNNABLE?
257:         JRST SCH2               ; NO
258:         JRST SCH1               ; YES, DO IT.
259: 
260: SCH2:   CAIN J,1                ; IS THIS JOB 1?
261:         SKIPE JOB(PID)          ; IF THIS IS JOB 1 AND THE NULL JOB RAN LAST, WE ARE DONE
262:         CAMN J,JOB(PID)         ; ARE WE BACK TO WHERE WE STARTED?
263:         JRST SCHD1              ; YES, RETURN NULL JOB
264:         JRST SCHD2              ; NO, SCAN NEXT JOB
265: >;END REPEAT 0
    SCHEDU page# 0007 next  prev
267: ; THIS ROUTINE CHECKS TO SEE IF THE JOB IN J IS REALLY RUNNABLE
268: ; RETURNS IF NOT RUNNABLE, TAKES SKIP RETURN IF RUNNABLE
269: 
270: CHKJOB: HLRZ    IOS,JBTSTS(J)           ;PICK UP STATUS BITS
271:         ANDCMI  IOS,RUNMSK              ;ZERO THE BITS THAT DON'T MATTER
272: IFN FTSWAP,<
273:         SKIPE   XJOB(J)
274:         JRST    CHKXJB                  ;JOB IS EXPANDING.  CAN'T BE RUN.
275: >
276:         CAIN    IOS,RUNABLE             ;IS THIS JOB RUNNABLE
277:         JRST    SCHD4                   ;YES.  MAKE SURE THAT SEGMENT IS THERE.
278:         TRNE    IOS,RUN
279:         POPJ    P,
280:         MOVM    DAT,JOBQUE(J)
281:         CAIE    DAT,RUNQ
282:         POPJ    P,
283:         PUSHACS
284:         MOVSI   DAT,RUN
285:         ANDCAM  DAT,JBTSTS(J)
286:         MOVNI   DAT,STOPQ
287:         MOVEM   DAT,JOBQUE(J)
288:         PUSHJ   P,REQUE
289:         PUSHJ   P,DISJOB
290:         PUSHJ   P,DISMES
291:         ASCIZ   /  IN RUNQ; NOT RUNNABLE. JBTSTS= /
292:         MOVE    TAC,JBTSTS(J)
293:         PUSHJ   P,DISOCT
294:         PUSHJ   P,DISCRLF
295:         POPACS
296:         POPJ    P,
    SCHEDU page# 0008 next  prev
298: ; HERE WE SEE IF THIS JOB'S HIGH SEGMENT IS IN CORE
299: 
300: SCHD4:  LDB DDB,PSEGN           ; DOES THIS JOB HAVE A HIGH SEGMENT?
301:         JUMPE DDB,CPOPJ1
302:         JUMPN PID,CPOPJ
303:         MOVE DSER,JBTSTS(DDB)
304:         TLNE DSER,SWP           ; IF SO, IS IT IN CORE?
305:         JRST SCH5               ;NO. SWAPPED OUT. LET'S DRAG IT IN!
306:         TLNE DSER,SHF
307:         POPJ P,
308:         SKIPE XJOB(DDB)
309:         JRST CHKXJ4
310:         MOVM DSER,JOBQUE(DDB)
311:         CAIN DSER,STOPQ
312:         JRST SCH3
313:         MOVEI DSER,STOPQ
314:         MOVNM DSER,JOBQUE(DDB)
315:         MOVEI DAT,QSTOPW
316:         PUSH P,J
317:         MOVE J,DDB
318:         PUSHJ P,QXFER
319:         POP P,J
320: SCH3:   CAMN J,SEGWAIT
321:         SETZM SEGWAIT
322:         JRST CPOPJ1
323: 
324: SCH5:   SKIPE SEGWAIT
325:         POPJ P,
326:         MOVEM J,SEGWAIT
327:         MOVM DAT,JOBQUE(DDB)
328:         CAIN DAT,SEGQ
329:         POPJ P,                 ; YES, DON'T REQUEUE HIM
330:         PUSH P,J                ; SWAPPED OUT. BRING IT IN
331:         MOVE J,DDB
332:         MOVEI DAT,SEGQ
333:         MOVNM DAT,JOBQUE(J)
334:         MOVEI DAT,QSEGW         ; PUT IT IN SEGMENT WAIT QUEUE
335:         PUSHJ P,QXFER
336:         POP P,J
337:         POPJ P,
    SCHEDU page# 0009 next  prev
339: ; AT THIS POINT, WE HAVE ALMOST DECIDED ON A JOB
340: ; WE CLAIM IT AND RETURN
341: 
342: SCH1:
343: REPEAT 0,<
344:         MOVE DDB,JB2STS(J)
345:         JUMPE PID,SCH6
346:         TLNN DDB,RUN2
347:         JRST SCH2
348:         JRST SCH4
349: SCH6:   TLNN DDB,RUN1
350:         JRST SCH2
351: SCH4:   PUSHJ P,JOBGET
352:         JRST SCH2
353: >
354:         POPJ    P,              ;RETURN
355: 
356: SCHD1:  SETZ J,                 ;RETURN NULL JOB
357:         SKIPN PID               ; FOR P1, WE WILL
358:         AOS NNULLJS             ; BUMP NUMBER OF TIMES NULL JOB SELECTED
359:         POPJ PDP,
    SCHEDU page# 0010 next  prev
361: ;;2-PROCESSOR ROUTINES TO INTERLOCK JOBS
362:                 ;JBTOWN(J) > 0 MEANS JOB J IS BEING RUN BY P1
363:                 ;JBTOWN(J) < 0 MEANS JOB J IS BEING RUN BY P2
364: REPEAT 0,<
365: 
366: JOBGET:
367:         PSYNC JBTCSC
368:         JUMPE PID,JOBG3
369:         SKIPLE JBTOWN(J)
370:         JRST JOBG1
371:         SOS JBTOWN(J)
372:         JRST JOBG2
373: JOBG3:  SKIPGE JBTOWN(J)
374:         JRST JOBG1
375:         AOS JBTOWN(J)
376: JOBG2:  AOS (P)
377: JOBG1:  XSYNC JBTCSC
378:         POPJ P,
379: 
380: JOBRLS:
381:         JUMPE PID,JOBRL1
382:         AOSLE JBTOWN(J)
383:         JRST JOBRER
384:         POPJ P,
385: JOBRL1: SOSL JBTOWN(J)
386:         POPJ P,
387: JOBRER: PUSHACS
388:         PUSHJ P,ALTNOW
389:         JFCL
390:         PUSHJ P,DISDATE
391:         PUSHJ P,DISMES
392:         ASCIZ /ππJOB RELEASED ILLEGALLY
393: /
394:         POPACS
395:         DEBCHECK
396:         SKIPN DISFLAG
397:         JRST JOBR2
398:         PUSHJ P,DISFLUSH
399:         JRST AUTOLOAD
400: 
401: JOBR2:  JUMPE PID,.+2
402:         SOSA JBTOWN(J)
403:         AOS JBTOWN(J)
404:         POPJ P,
405: >
    SCHEDU page# 0011 next  prev
407: ; HERE, WE SORT THE RUN QUEUE INTO PRIORITY ORDER
408: 
409: ORDER:                                 ;CALLED WHEN ORDYET≠0
410:         MOVE    DDB,INTIME+P1PID        ;TOTAL INTERRUPT TIME
411:         EXCH    DDB,OINTIME             ;SAVE IT
412:         SUB     DDB,OINTIME             ;-(RECENT INTERRUPT TIME)
413:         MOVE    J,UPTIME+P1PID          ;CURRENT UPTIME
414:         EXCH    J,OUTIME                ;SAVE IT
415:         SUB     J,OUTIME                ;-(CHANGE IN UPTIME)
416:         MOVE    DSER,DDB                ;SAVE -(RECENT INTERRUPT TIME)
417:         SUB     DDB,J                   ;(DELTA UPTIME)-(DELTA INTERRUPT TIME)
418:         MOVEM   DDB,JLFACTOR            ;SAVE AS WEIGHTING FACTOR.
419:         MOVEM   DDB,RJLFACTOR
420:         MOVSI   DDB,1
421:         IDIVM   DDB,RJLFACTOR           ;AVOID REMAINDER
422:         IMULI   DSER,=1000
423:         IDIVM   DSER,J
424:         MOVEM   J,JLRIT                 ;SAVE RECENT INTERRUPT FRACTION, *1000
425: 
426:         MOVE    TAC,[XWD JBTNPR,JBTPRI]
427:         BLT     TAC,JBTPRI+JOBN-1
428:         MOVNI   Q,RUNQ
429: ORD3:   HRRE    Q,JBTQ(Q)               ;PICK UP FIRST JOB IN RUN QUEUE
430:         JUMPL   Q,ORDX                  ;NO MORE, EXIT.
431: ORD2:   HRRE    DSER,JBTQ(Q)            ;GET NEXT JOB IN QUEUE.
432:         JUMPL   DSER,ORDX               ;IF NO NEXT JOB, WE'RE DONE.
433:         MOVE    DDB,JBTPRI(DSER)        ;COMPARE PRIORITIES.
434:         CAMG    DDB,JBTPRI(Q)
435:         JRST    ORD3            ;RIGHT ORDER  PRI[Q]>PRI[DSER].  ADVANCE IN QUEUE.
436:         HLRE    UCHN,JBTQ(Q)    ;WRONG ORDER. SCAN BACKWARDS TO FIND RIGHT SPOT
437: ORD1:   JUMPL   UCHN,ORDINS             ;JUMP IF THERE'S NO FURTHER BACKWARDS.
438:         CAMG    DDB,JBTPRI(UCHN)        ;IS THIS WHERE IT SHOULD BE?
439:         JRST    ORDINS                  ;YES. PRI[UCHN]>PRI[DSER]
440:         HLRE    UCHN,JBTQ(UCHN)         ;ADVANCE BACKWARDS.
441:         JRST    ORD1
442: 
443: ;DELETE ENTRY POINTED TO BY DSER; INSERT IT AFTER ENTRY POINTED TO BY UCHN.
444: ORDINS: MOVE    DDB,JBTQ(DSER)  ;DELETE HIM FROM OLD POSITION.
445:         HLLM    DDB,JBTQ(DDB)   ;SET BACKWARDS LINK IN GUY FORWARD FROM US.
446:         MOVS    DDB,DDB
447:         HLRM    DDB,JBTQ(DDB)   ;SET FORWARDS LINK IN GUY BACKWARD FROM US.
448:         MOVE    DDB,JBTQ(UCHN)  ;ADD US AFTER (FORWARDS FROM) OUR TRUE PREDECESSOR
449:         HRRM    DDB,JBTQ(DSER)  ;FLINK[DSER]←FLINK[UCHN]
450:         HRRM    DSER,JBTQ(UCHN) ;FLINK[UCHN]←DSER
451:         HRLM    UCHN,JBTQ(DSER) ;BLINK[DSER]←UCHN
452:         HRLM    DSER,JBTQ(DDB)  ;BLINK[FLINK[DSER]]←DSER
453:         JRST    ORD2            ;HE IS IN PLACE, SCAN SOME MORE (DON'T ADVANCE Q)
454: 
455: ORDX:   SETZM   ORDYET                  ;TELL PDP-6 THAT WE'VE FINISHED OUR SORT
456:         POPJ    P,
    SCHEDU page# 0012 next  prev
458: ; THIS ROUTINE CALCULATES THE VARIOUS JOB PRIORITIES
459: ; IT DOES SO BY TAKING THE CURRENT JOB LOADING FACTOR,
460: ; DEFINED TO BE TIME WAITING FOR COMPUTE TIME OVER REAL TIME,
461: ; AND PUTS IT IN A TABLE WITH THE PREVIOUS JLLENGTH
462: ; FACTORS. THEN IT MAKES A WEIGHTED AVERAGE OF THESE AND
463: ; ADDS IT INTO THE JOBS TOTAL JOB LOADING HISTORY, WHICH IS
464: ; DECAYED EXPONENTIALLY BY SUBTRACTING A FRACTION EVERY SO OFTEN
465: 
466: GRSPRI←←360000
467: 
468: IFE FTSWAP,<
469: JLCAL: POPJ    P,
470: >
471: 
472: IFN FTSWAP,<
473: JLCAL: MOVE    J,ORDYET                ;HAS THE PDP-10 DONE IT'S THING YET?
474:         JUMPN   J,CPOPJ                 ;IF NOT, WAIT FOR IT
475:         SOSLE   J,JLCYET
476:         JRST    JLCA1
477:         SETZM   SWPCNT
478:         MOVEI   DDB,JLTIME
479:         MOVEM   DDB,JLCYET
480: 
481:         SETOM   ORDYET
482:         JUMPE   PID,ORDER               ;IF WE'RE THE PDP-10, NO NEED TO INTERLOCK
483:         POPJ    P,
484: 
485: JLCA1:  ROT     J,-1            ;DIVIDE BY 2
486:         JUMPL   J,CPOPJ         ;SKIP ODD TICKS.
487:         CAIL    J,JOBN          ;LEGAL JOB NUMBERS ONLY
488:         POPJ    P,
489:         SKIPE   DDB,JBTJL(J)    ;IS THERE A HISTORY TABLE?
490:         JRST    JLCA3           ;YES, GO RECOMPUTE PRIORITY
491:         MOVSI   DDB,(3B2)       ;NO. MAKE A SILLY ASSUMPTION
492:         MOVEM   DDB,JBTNPR(J)
493:         POPJ    P,
    SCHEDU page# 0013 next  prev
495: ; CALCULATE ONE JOB'S NEW PRIORITY
496: ; DECAY PAST, WEIGHT NEAR PAST, THEN COMPUTE PRIORITY
497: ; JBTJLH = DISTANT PAST CELL.
498: ; JBTJL  = TABLE OF FS BLOCKS, ONE-PER-JOB. KEEPS RECENT HISTORY.
499: ; JBTNPR = JOB'S NEW PRIORITY.
500: ; JBTRNB = AMOUNT OF CPU TIME THAT JOB HAS ACCUMULATED SINCE LAST CALL HERE.
501: 
502: JLCA3:  MOVN    DSER,JBTJLH(J)          ;FIRST, DECAY DISTANT PAST
503:         ASH     DSER,-5
504:         ADDM    DSER,JBTJLH(J)          ;PAST ← (31/32)*PAST
505: 
506:         MOVE    UCHN,(DDB)              ;ADD OLDEST TO DISTANT HISTORY
507:         ADDM    UCHN,JBTJLH(J)          ;PAST ← PAST+OLDEST "RECENT" HISTORY
508: 
509:         MOVSI   DSER,1(DDB)             ;BLT DOWN RECENT HISTORY
510:         HRRI    DSER,(DDB)
511:         BLT     DSER,JLLENGTH-2(DDB)    ;MAKE ROOM FOR NEW FACTOR
512: 
513:         HRRZ    DSER,JBTRNB(J)          ;PICK UP RUN TIME USED
514:         IMUL    DSER,RJLFACTOR          ;DIVIDE BY USEABLE TIME. = PROCESSOR LEVEL
515:         MOVEM   DSER,JLLENGTH-1(DDB)    ;SET IN LAST POSITION IN TABLE (MOST RECENT)
516:                                         ;1,,0 = 100% PL
517: 
518:         MOVE    DSER,JBTSTS(J)          ;GIVE LOGIN AND LOGOUT GOOD SERVICE
519:         TLNN    DSER,JACCT              ;ACCOUNTING?
520:         JRST    JLCA15                  ;NO.
521:         HRLZI   DDB,377777              ;GIVE THEM THE HIGHEST POSSIBLE PRIORITY
522:         HLR     DDB,JBTPRI(J)   ;RANDOM ;PUT IN SOME NUMBERS FOR GOOD MEASURE
523: JLCA9:  MOVEM   DDB,JBTNPR(J)           ;SAVE USER'S PRIORITY
524:         POPJ    P,
525: 
526: JLCA15: SETZB   AC3,JBTRNB(J)           ;
527:         MOVEI   TEM,=100                ;WEIGHT.
528:         MOVEI   AC1,0                   ;COUNT WEIGHTS USED
529:         MOVSI   DSER,JLLENGTH-1
530:         HRRI    DSER,JLLENGTH-1(DDB)    ;DSER ← <JLLENGTH-1,,ADDRESS OF DATA>
531: JLCA4:  MOVE    AC2,(DSER)              ;PICK UP HISTORICAL JOB LOAD
532:         IMULI   AC2,(TEM)               ; %PL * WEIGHT
533:         ADDI    AC1,(TEM)               ;SUM OF ALL WEIGHTS.
534:         ADD     AC3,AC2
535:         MOVEI   AC2,(TEM)
536:         LSH     AC2,-3
537:         SUBI    TEM,(AC2)               ;WEIGHT ← (7/8)*WEIGHT.
538:         SUB     DSER,[1,,1]
539:         JUMPG   DSER,JLCA4              ;LOOP THROUGH JOB HISTORY
540: 
541:         MOVE    AC2,JBTJLH(J)           ;PICK UP DISTANT PAST
542:         IMULI   AC2,(TEM)               ;JUST TO MAKE CURVES JOIN
543:         ADDI    AC1,(TEM)               ;ADD UP WEIGHTS.
544:         ADD     AC3,AC2
545:         SUB     AC3,[3B2]               ;USAGE - DEFAULT PRIORITY = -(PRIORITY)
546:         MOVNM   AC3,JBTNPR(J)           ;THIS IS THEN HIS PRIORITY
547: 
548: ; CHECK THIS JOB'S SERVICE LEVEL TO SEE IF HE DESERVES HIGHER PRIORITY.
549: ;AC2 = SERVICE GUARANTEE LEVEL, TEM = SUM OF ALL THE SERVICE LEVELS
550: 
551:         SKIPE   JBTGSL
552:         POPJ    P,
553:         HRRZ    AC2,JBTGSL(J)           ;PICK UP THE SERVICE LEVEL GUARANTEE
554:         CAILE   AC2,320000              ;MORE THAN 40.625% SERVICE LEVEL?
555:         MOVEI   AC2,320000              ;REDUCE TO 40% - REG'S UNFAIRNESS.
556:         HRRZ    DDB,PRJPRG(J)
557:         MOVEI   TEM,0                   ;ADD UP SERVICES TO RELATIVES.
558:         MOVEI   DSER,JOBN-1             ;INDEX FOR LOOP THRU JOBS
559: JLCA5:  HRRZ    UCHN,PRJPRG(DSER)
560:         CAIN    DDB,(UCHN)              ;DOES THIS GUY HAVE THE SAME PPN
561:         SKIPN   UCHN,JBTJL(DSER)        ;YES, DOES HE HAVE ANY PAST
562:         JRST    JLCA6                   ;NO. LOOP FOR NEXT GUY
563: 
564:         HRLI    UCHN,-JLLENGTH          ;AOBJN POINTER TO PL HISTORY
565:         ADD     TEM,(UCHN)              ;ADD IN THE SERVICE LEVEL
566:         AOBJN   UCHN,.-1
567: 
568: JLCA6:  SOJG    DSER,JLCA5              ;NOW LOOP AROUND TO LOOK FOR ANOTHER GUY WITH SAME PPN
569:         IDIVI   TEM,JLLENGTH            ;NORMALIZE PL.  SUM OF PL OF ALL RELATIVES.
    SCHEDU page# 0014 next  prev
571: ; ADD UP THE SERVICES TO HIS VARIOUS RELATIVES
572:         CAMG    AC2,TEM         ; SEE IF HE GOT MORE THAN HE BARGAINED FOR
573:         POPJ    P,              ; YES, HE NOW JUST FOLLOWS HIS PRIORITY
574:         SKIPN   SLCOST          ; ARE WE CHARGING FOR CORE?
575:         JRST    JLCA20          ;NO SKIP THIS STUFF.
576:         PUSH    P,AC2           ;SAVE HIS GSL 
577:         PUSH    P,TEM           ;SAVE ACTUAL PL
578:         MOVEI   TAC1,JOBN-1     ; OK. NOW SEE IF HE IS A CORE LEVEL VIOLATOR
579:         HRRZ    AC1,PRJPRG(J)
580:         MOVEI   AC2,0           ;COUNT SUM OF CORE SIZES.
581: JLCA10: HRRZ    AC3,PRJPRG(TAC1)
582:         MOVM    DAT,JOBQUE(TAC1)        ; PICK UP HIS QUEUE CODE
583:         CAME    AC1,AC3
584:         JRST    JLCA11
585:         CAIE    DAT,TQ          ;ADD HIS CORE SIZE IF RUNNING OR LOCKED IN
586:         CAIN    DAT,RUNQ
587:         JRST    JLCA14
588:         CAIE    DAT,DIOWQ
589:         SKIPE   JBTST2(TAC1)    ;SPACEWAR DOES THIS TOO
590:         JRST    JLCA14
591:         MOVEI   DAT,JLOCK
592:         TDNN    DAT,JBTSTS(TAC1)
593:         JRST    JLCA11
594: 
595: JLCA14: PUSH    P,TAC1          ;SAVE JOB NUMBER WE'RE THINKING ABOUT.
596:         PUSHJ   P,CORSGT        ;GET HIS CORE SIZE IN TAC1
597:         ADDI    AC2,(TAC1)      ;ADD IN TO CORE TOTAL
598:         MOVE    TAC1,(P)        ;GET JOB NUMBER BACK
599:         LDB     TAC1,[POINT 6,JBTSTS(TAC1),35]
600:         JUMPE   TAC1,JLCA13
601:         MOVEI   DDB,JOBN-1      ;HE GETS CHARGED FOR (1/N) OF HIS HIGH SEGMENT CORE
602:         MOVEI   UCHN,0          ;WHERE N WILL BE THE NUMBER OF PEOPLE POINTING AT THIS SEGMENT
603: JLCA12: LDB     DSER,[POINT 6,JBTSTS(DDB),35]
604:         CAMN    DSER,TAC1
605:         SKIPL   JBTSTS(DDB)     ; ONLY IF HE IS ACTIVE
606:         CAIA
607:         ADDI    UCHN,1          ; BUMP NUMBER OF JOBS POINTING TO THIS SEGMENT BY ONE
608:         SOJG    DDB,JLCA12
609:         PUSHJ   P,CORSGT        ;GET THE SIZE OF THIS UPPER
610:         MOVE    TAC,TAC1
611:         IDIVI   TAC,(UCHN)      ; GET HIS SHARE OF THE UPPER SEGMENT CORE
612:         ADD     AC2,TAC         ; AND ADD IT IN TO THE TOTAL
613: JLCA13: POP     P,TAC1
614: JLCA11: SOJG    TAC1,JLCA10     ; LOOP AROUND FOR NEXT JOB
615: 
616:         LSH     AC2,-=10        ; CONVERT TO NUMBER OF 1K BLOCKS
617:         MOVSI   AC2,(AC2)       ; PUT CORE IN K IN LEFT HALF
618:         MOVE    AC3,SLCOST      ;AC3←1 OR 2 (LOW OR HIGH COST, RESPCTIVELY)
619:         IDIV    AC2,[=1000              ;CONVERT TO ONE PERCENT FOR EACH
620:                   =500]-1(AC3)  ;       10K (LO) OR 5K(HI) OF CORE
621:         POP     P,TEM           ; GET PROCESSOR LEVEL
622:         ADD     TEM,AC2         ; CALL THIS PROCESSOR LEVEL TOO.
623:         POP     P,AC2           ; GET BACK HIS GSL
624: JLCA20: CAMLE   TEM,AC2         ; IS HE OVER HIS GUARANTEE?
625:         POPJ    P,              ; YES, HE IS OFFICIALLY A SCROUNGER
626:         MOVSI   DDB,GRSPRI      ; NO, GIVE HIM HIGH PRIORITY
627:         HLR     DDB,JBTNPR(J)   ; WITH HIS REAL PRIORITY AS HIS LOW-ORDER BITS
628:         MOVEM   DDB,JBTNPR(J)
629:         POPJ    P,
630: >
    SCHEDU page# 0015 next  prev
632: SUBTTL  QCSS    24 JULY 67
633: ;THIS ROUTINE MUST BE ASSEMBLED WITH THE CONFIGURATION
634: ;TAPE TO DEFINE NUMBER OF JOBS
635: ;THIS SECTION CONTAINS 2 ROUTINES FOR Q MANIPULATION
636: ;AND NECESSARY TABLES FOR SPECIFING OPERATIONS PERFORMED
637: ;BY THEM.
638: 
639: 
640: 
641: ;STORAGE:
642: ;EACH Q IS A RING STRUCTURED, FOWARD AND BACKWARD
643: ;LINKED SRING LIST. THE "FIRST" LINK IN A Q IS
644: ;A Q-HEADER POINTING TO THE FIRST AND LAST MEMBERS OF THE Q.
645: ;A NULL Q HAS ONE LINK--THE Q-HEADER ITSELF.  THE LINKS MAKING
646: ;UP THE QS ARE CONTAINED IN A TABLE (JBTQ) WITH NEGATIVE
647: ;INDICIES (ADDRESSES LESS THAN JBTQ) USED FOR Q-HEADERS AND
648: ;POSITIVE INDICIES USED FOR MEMBERS (JOBS). THUS ONLY ONE WORD
649: ;PER LINK IS NECESSARY--ITS ADDRESS RELATIVE TO JBTQ GIVES THE
650: ;JOB NO. (OR Q NO. IF NEGATIVE) WHICH IT REPRESENTS WHILE
651: ;ITS CONTENTS CONTAINS THE LINKING POINTERS. THESE
652: ;POINTERS ARE ALSO INDICIES RELATIVE TO JBTQ RATHER THAN
653: ;ABSOLUTE ADDRESSES--RH(LINK)=FOWARD POINTER;
654: ;LH(LINK)=BACKWARD POINTER.
655: ;A JOB IS ASSUMED TO BE IN NO MORE THAN ONE Q AT A TIME, AND
656: ;THE NULL JOB (JOB 0) DOES NOT APPEAR IN THE QS  (I.E. JBTQ
657: ;ITSELF IS THE Q-HEADER FOR Q 0).
658: 
659: ;ROUTINES:
660: ;BOTH ROUTINES ARE "TABLE DRIVEN" IN THE SENSE THAT THE
661: ;CALLING ROUTINE PROVIDES THE ADDRESS OF A TABLE WHICH
662: ;DEFINES THE SPECIFIC OPERATIONS TO BE PERFORMED.
    SCHEDU page# 0016 next  prev
664: ;QUEUE INITIALIZATION
665: ;PUT ALL JOBS IN NULL QUEUE(JOB NO. NOT ASSIGNED)
666: ;CALLED ON RESTART AT LOC. 143
667: 
668: 
669: QINI:
670:         MOVNI DDB,MXQUE         ;MAKE ALL QUEUE HEADERS POINT TO THEMSELVES
671:         HRL DDB,DDB             ;BACKWARD POINTERS TOO
672:         MOVEM DDB,JBTQ(DDB)
673:         AOBJN DDB,.-1
674:         MOVEI DDB,-NULQ         ;PUT JOBS ALL IN NULQ QUEUE
675:         MOVSM DDB,JBTQ+1        ;BACK POINTER FOR JOB 1
676:         MOVEI J,JOBN-1          ;MAX. JOB NO.
677:         MOVEM DDB,JBTQ(J)       ;FOR. POINTER OF JOBMAX JOB NO.
678:         HRLM J,JBTQ-NULQ        ;SET NULQ HEADER TO POINT TO JOB1
679:         MOVEI DDB,1             ;AND JOBMAX
680:         HRRM DDB,JBTQ-NULQ      ;FORWARD POINTER
681:         MOVNI DSER,NULQ
682: QINI1:  HRRM J,JBTQ-1(J)        ;JOB I-1 POINT TO JOB I
683:         MOVEM DSER,JOBQUE(J)
684:         SOJLE J,CPOPJ           ;FINISHED?
685:         SETZM JBTQ
686:         HRLM J,JBTQ+1(J)        ;BACK POINTER JOB I+1 POINTS TO JOB I
687:         JRST QINI1
    SCHEDU page# 0017 next  prev
689: ;DELETES A JOB FROM ITS "SOURCE-Q", DETERMINES A "DEST-Q"
690: ;ACCORDING TO ONE OF 3 FUNCTIONS, AND INSERTS THE JOB AT
691: ;THE BEGINNING OR END OF THIS DEST-Q.
692: ;THE DRIVING TABLES ARE "TRANSFER TABLES":
693: ;
694: ;
695: ;T. TABLE:      XWD <0 OR -1>, -<QUEUE NUMBER>
696: 
    SCHEDU page# 0018 next  prev
698: ;CALLING SEQUENCE:
699: ;       MOVE  J,[JOB NUMBER]
700: ;       MOVEI/HRROI DAT,TRANS TABLE ADDRESS     ;DAT NEG MEANS GEN QXFER INT IF NECC
701: ;       PUSHJ PDP,QXFER
702: ;  ON RETURN J IS UNALTERED; LH(Q)=-1  IF QUANT. TIME NOT
703: ;  RESET; =QUANT. TIME IF RESET;RH(Q)=DEST.Q
704: 
705: QXFER: CAIGE   J,JOBN          ;JOB NUMBER TOO HIGH?
706:         JRST    QXFER1          ;J OK
707:         PUSHACS
708:         PUSHJ   P,DISDATE
709:         PUSHJ   P,DISERR
710:         [ASCIZ/ILLEGAL JOB NUMBER AT QXFER.
711: J=/]
712:         DISARG(DCP,<-20+J(P)>)
713:         [ASCIZ/
714: /]
715:         -1
716:         POPACS
717:         POPJ    P,
718: QXFER1: JUMPGE DAT,QXFER2       ;NO INT NEEDED IF POS
719:         MOVSI DSER,INTQXF       ;DOES HE WANT INT ON Q XFER?
720:         TDNN DSER,JBTIEN(J)
721:         JRST QXFER2
722:         IORM DSER,JBTIRQ(J)
723:         SETOM INTREQ
724: QXFER2: SETZM   SWPCNT          ; FIRE UP SWAPPER WHEN THE SITUATION CHANGES
725:         AOS     NQXFERS         ;COUNT A QUEUE TRANSFER
726:         MOVE    Q,(DAT)         ;GET TRANSFER TABLE ADDRESS
727: 
728:         TLNE    Q,200000        ;ARE WE NOW WAITING FOR THE SYSTEM?
729:         JRST    QXFER3          ;YES
730:         MOVE    DSER,UPTIME     ;NO, WE ARE WAITING FOR THE USER.
731:         SKIPGE  JBTWAT(J)       ;WERE WE ALREADY WAITING FOR THE USER?
732:         ADDM    DSER,JBTWAT(J)  ;NO.  NOTE THAT WE ARE NOW
733:         JRST    QXFER4
734: 
735: QXFER3: MOVN    DSER,UPTIME     ;WE ARE WAITING FOR THE SYSTEM
736:         SKIPL   JBTWAT(J)       ;WERE WE ALREADY WAITING FOR THE SYSTEM?
737:         ADDM    DSER,JBTWAT(J)  ;NO.  NOTE THAT WE ARE NOW
738: QXFER4: HRRE DSER,Q             ; SAVE QUEUE CODE IN DSER
739:         MOVM DSER,DSER          ;GET THE Q CODE. PUT IT IN JBTSTS FOR THIS JOB
740:         CAIG DSER,MAXQ          ;IF RELEVANT TYPE
741:         DPB DSER,[POINT JWSIZ,JBTSTS(J),JWPOS]
742: 
743: IFN FTSTAT, <                   ;GATHER STATISTICS.
744:         PUSH P,TAC
745:         LSH DSER,6
746:         MOVEI TAC,QUESTA(DSER)
747:         PUSHJ P,STAPUT
748:         POP P,TAC
749: >;FTSTAT
750: 
751:         MOVE    DSER,JBTQ(J)    ;DELETE JOB FROM SOURCE-Q
752:         MOVS    UCHN,DSER       ;DSER=FORW. LINK, UCHN=BACK LINK
753:         HRRM    DSER,JBTQ(UCHN) ;GO BACK AND LINK FORWARD PAST THIS JOB
754:         HRLM    UCHN,JBTQ(DSER) ;GO FORWARD AND LINK BACKWARD PAST THIS JOB
755:         CAME    Q,QRUNW         ;ARE WE ENTERING THE RUN QUEUE?
756:         JRST    QXF3            ;NO
757:         MOVE    AC2,JBTPRI(J)   ;GET THIS GUY'S PRIORITY
758:         CAMGE   AC2,[3B2]       ;SKIP IF BIG: WE WILL SCAN FORWARD
759:         JRST    QXSB            ;SMALL PRIORITY: SCAN BACKWARDS.
760:         HRRE    DSER,JBTQ(Q)    ;SEARCH AHEAD. PICK UP FORWARD LINK
761:         JUMPL   DSER,QXF3       ;NO ONE HERE. THERE'S NO ORDERING NEEDED
762: QXF6:   CAML    AC2,JBTPRI(DSER)        ;IS THIS THE RIGHT PLACE FOR HIM?
763:         JRST    QXF8            ;YES. OUR (J) PRIORITY > HIS (DSER)
764:         HRRE    DSER,JBTQ(DSER) ;OUR PRIORITY IS SMALL, KEEP LOOKING
765:         JUMPGE  DSER,QXF6       ;LOOP UNLESS END OF LIST, STICK HIM AT BOTTOM.
766:         JRST    QXF3            ;GO STICK HIM IN AT THE BOTTOM.
767: QXF8:   HLRZ    UCHN,JBTQ(DSER) ;PUT US BEFORE DSER, AND AFTER DSER'S BACK LINK.
768:         HRLZM   UCHN,JBTQ(J)    ;STICK HIS BACK LINK IN AS OUR BACK LINK.
769:         HRLM    J,JBTQ(DSER)    ;STICK US IN AS DSER'S BACK LINK.
770:         HRRM    DSER,JBTQ(J)    ;STICK DSER IN AS OUR FORWARD LINK.
771:         HRRM    J,JBTQ(UCHN)    ;STUFF US IN AS UCHN'S FORWARD LINK.
772:         JRST    QXF4            ;ALL DONE WITH TRANSFER.
773: 
774: QXSB:   HLRE    DSER,JBTQ(Q)    ;SORTING IN FROM THE BOTTOM. FOLLOW BACK.
775:         JUMPL   DSER,QXF3       ;JUMP IF Q IS EMPTY. PUT US IN THE END.
776: QXF5:   CAMG    AC2,JBTPRI(DSER)        ;SKIP IF OUR PRIORITY ≥ HIS PRIORITY
777:         JRST    QXF9            ;OUR PRIORITY IS SMALL. WE HAVE A HOME.
778:         HLRE    DSER,JBTQ(DSER) ;LINK BACKWARDS.
779:         JUMPGE  DSER,QXF5       ;CONTINUE SCAN FOR A PLACE TO PUT US.
780:         JRST    QXF7            ;WE BELONG AT TOP OF Q.
781: 
782: QXF9:   HRRZ    UCHN,JBTQ(DSER) ;WE BELONG BELOW DSER. GET DSER'S FORWARD LINK
783:         MOVEM   UCHN,JBTQ(J)    ;SET OUR FORWARD LINK FROM DSER'S LINK.
784:         HRRM    J,JBTQ(DSER)    ;SET US AS DSER'S FORWARD LINK.
785:         HRLM    DSER,JBTQ(J)    ;SET DSER AS OUR BACKWARDS LINK
786:         HRLM    J,JBTQ(UCHN)    ;SET US AS UCHN'S BACKWARDS LINK.
787:         JRST    QXF4            ;ALL DONE.
788: 
789: ;QXF3 IS TO ADD GUY AT THE END OF THE QUEUE
790: ;QXF7 IS TO ADD GUY AT THE BEGINNING OF THE QUEUE
791: 
792: QXF3:   HLR     Q,JBTQ(Q)       ;GET THE LAST LINK IN Q.
793:                                 ;UCHN WILL BE SET TO THE Q-HEADER.
794: QXF7:   MOVE    UCHN,JBTQ(Q)    ;UCHN IS FORWARD LINK AND Q IS Q-HEADER.
795:         HRRM    J,JBTQ(Q)       ;SET FORWARD LINK:
796:                                 ;F/ INSERT IN Q HEAD. B/ INSERT AT END.
797:         HRLM    J,JBTQ(UCHN)    ;SET BACK LINK:
798:                                 ;F/ INSERT IN FIRST.  B/ INSERT AT Q-HEAD.
799:         HRRZM   UCHN,JBTQ(J)    ;SET OUR FORWARD LINK
800:         HRLM    Q,JBTQ(J)       ;SET OUR BACK LINK.
801: 
802: QXF4:   JUMPL   Q,QNORUN        ; RETURN IF QUANTUM TIME NOT REQUESTED
803: 
804: ;HERE WE ARE IS JOB IS COMING INTO A RUN QUEUE
805: 
806: QFIX1:  SETZ    DSER,           ;CLEAR WAIT STATE CODE IN JBTSTS:
807:         DPB     DSER,[POINT JWSIZ,JBTSTS(J),JWPOS]
808:         POPJ    P,              ;RETURN
    SCHEDU page# 0019 next  prev
810: ; JOB IS NOT RUNNING.  REQUEUE HIS SEGMENT IF NEEDED.
811: 
812: QNORUN: CAMN    J,SEGWAIT       ; WAS THIS GUY WAITING FOR HIGH SEGMENT?
813:         SETZM   SEGWAIT         ; YES, NOT ANY MORE
814:         LDB     DSER,PSEGN      ; DOES THIS JOB HAVE A HIGH SEGMENT?
815:         JUMPE   DSER,CPOPJ      ; NO, FORGET IT
816:         MOVM    UCHN,JOBQUE(DSER)       ; YES, IS IT IN SEGMENT WAIT QUEUE?
817:         CAIE    UCHN,SEGQ
818:         POPJ    P,              ;NO, RETURN
819:         PUSH    P,J             ;YES, IF NO ONE ELSE WANTS SEGMENT, REQUE IT
820:         MOVEI   J,JOBN-1        ;LOOK THRU ALL THE WORLD.
821: QNORU1: LDB     UCHN,PSEGN
822:         CAIE    UCHN,(DSER)     ;SAME SEGMENT?
823:         JRST    QNORU3          ;NOPE.
824:         MOVE    AC2,JBTSTS(J)   ;GET JOB STATUS OF THIS GUY
825:         TLNE    AC2,SWP         ; DOESN'T COUNT IF HE'S SWAPPED OUT
826:         JRST    QNORU3          ;SO LOOK FOR SOMEONE ELSE.
827:         MOVM    UCHN,JOBQUE(J)  ;AND HIS QUEUE
828:         CAIE    UCHN,RUNQ       ;IS THIS GUY RUNNABLE?
829:         CAIN    UCHN,TQ
830:         JRST    QNORU4          ;THIS GUY WANTS THIS SEGMENT!
831: QNORU3: SOJG    J,QNORU1        ;LOOP.
832:         MOVNI   DAT,STOPQ       ;NO ONE CARES FOR THIS.
833:         MOVEM   DAT,JOBQUE(DSER)        
834:         MOVEI   DAT,QSTOPW      ;NO RUNNABLE JOB USING THIS SEGMENT, REQUEUE IT
835:         MOVE    J,DSER
836:         PUSHJ   P,QXFER
837: QNORU4: POP     P,J             ;RETURN BY POPPING J.
838:         POPJ    P,              ;AND POPJ.
    SCHEDU page# 0020 next  prev
840: ;SCANS THE QS RETURNING THE NUMBERS OF THE JOBS IN THE QS.
841: ;THE ORDER AND MANNER IN WHICH THE QS ARE SEARCHED IS
842: ;DETERMINED BY A "SCAN TABLE" ADDRESSED IN THE CALLING SEQ.
843: ;THE SCAN TABLE HAS THE FORM:
844: ;
845: ;SCANTAB:       XWD <Q1>,<CODE1>        ;SCN Q1 ACCRDING TO CODE1
846: ;               ...
847: ;               XWD <QN>,<CODEN>        ;QN ACCORDING TO CODEN
848: ;               Z               ;ZERO TERMINATES TABLE
849: ;
850: ;EACH Q MAY BE SCANNED IN ONE OF FOUR WAYS SPECIFIED BY <CODE>
851: ;THE CODES ARE:
852: ;
853: ;QFOR   SCAN WHOLE Q FOWARD
854: ;QFOR1  SCAN FOR ONLY THE 1ST MEMBER (IF ANY)
855: ;QBAK   SCAN WHOLE Q BACKWARD
856: ;QBAK1  SCAN BACKWARD FOR ALL MEMBERS EXCEPT THE 1ST
857: ;
858: ;CALLING SEQ.
859: ;
860: ;       MOVEI DAT,SCAN TABLE ADDRESS
861: ;       JSP PC,QSCAN    ;SET UP PC FOR REPEATED RETURNS
862: ;       ...             ;RETURN HERE WHEN NO MORE JOBS
863: ;       ...             ;RETURN HERE WITH NEXT JOB IN AC J
864: ;                       ;   AND ITS Q IN LH(QR)
865: ;
866: ;       PERFORM ANY NECESSARY TESTING OF THIS JOB
867: ;       J,DAT,PC,QR MUST BE PRESERVED
868: ;
869: ;       JRST (QR)       ;RETURN TO QSCAN TO GET NEXT JOB
870: ;                       ;   IF THIS ONE NOT ACCEPTABLE
871: ;
    SCHEDU page# 0021 next  prev
873: QSCAN: SKIPN QR,(DAT)  ;END OF SCAN TABLE?
874:         JRST (PC)       ;YES--RETURN TO CALL+1
875:         HLRE J,QR       ;NO--GET NO. OF Q
876:         JRST (QR)       ;DISPATCH
877: 
878: QFOR1:  MOVEI QR,QFORB  ;ONLY THE FIRST JOB
879: 
880: QFOR:   HRRE J,JBTQ(J)  ;SCAN FOWARD ALL JOBS
881:         JUMPGE J,1(PC)  ;RETURN THIS JOB NO. CALL+2 UNLESS--
882: QFORB:  AOJA DAT,QSCAN  ;END OF THIS Q--GET NEXT Q
883: 
884: QBAK1:  HLRE J,JBTQ(J)  ;SCAN BACKWARD ALL JOBS EXCEPT 1TT
885:         SKIPLE JBTQ(J)  ;IS THIS THE FIRST MEMBER?
886:         JRST 1(PC)      ;NO--RETURN CALL+2
887:         AOJA DAT,QSCAN  ;YES--GET NEXT Q
888: 
889: QBAK:   HLRE J,JBTQ(J)  ;SCAN BACKWARD ALL JOBS
890:         JUMPG J,1(PC)   ;RETURN CALL+2 WITH JOB NO. UNLESS
891:         AOJA DAT,QSCAN  ;BEG OF THIS Q--GET NEXT Q
892: 
893: QFOR2:  HRRE J,JBTQ(J)  ; ALL BUT FIRST JOB
894:         HRRI QR,QFOR    ; PUT UP NEW RESCAN ADDRESS
895:         JUMPGE J,QFOR   ; IF NOT END OF QUEUE, GET SECOND JOB
896:         AOJA DAT,QSCAN  ; END OF QUEUE, TRY NEXT ONE
    SCHEDU page# 0022 next  prev
898: DEFINE X'(A),<
899: 
900: A'Q←←ZZ
901: ZZ←←ZZ+1
902: >
903:         ZZ←←0
904:         QUEUES
905:         LOC←←ZZ
906: NQUEUE←←LOC             ;NO. OF QUEUES COUNTING RUN QUEUE
907: XP MAXQ,NQUEUE-1        ;MAX. STATE CODE WHICH HAS AN AVAL FLAG
908: XP MINQ,STQ             ;MINIMUM SHARABLE DEVICE QUEUE
909: XP AVLNUM,MAXQ          ;MAX. STATE CODE WHICH HAS AN AVAL FLAG
910: 
911: ;DEFINE STATE CODES WHICH DO NOT HAVE AVAL AND REQ FLAGS
912: 
913: 
914: DEFINE X!(A)
915: <
916: A!Q←←LOC
917: LOC←←LOC+1
918: >
919:         CODES
920:         PQUEUES         ; PROCESSOR QUEUES TOO!!
    SCHEDU page# 0023 next  prev
922: ;CORRESPONDENCE TABLE BETWEEN JOB STATUS CODES AND QUEUE TRANSFER TABLES
923: ;USED BY SCHEDULER
924: ;RUNCSS SETS JOB STATUS WORD TO NEW STATE CODE.
925: ;SCHEDULER SETS UP QUEUE TRANSFER TABLE ADDRESS FROM
926: ;FOLLOWING TABLE USING NEW STATE CODE AS INDEX
927: 
928: DEFINE X!(A)
929: <       Q!A!W
930: >
931: 
932: 
933: QBITS: QUEUES
934:         CODES
935:         PQUEUES
936: 
937: 
938: ;400000,,0 BIT MEANS IS NOT RUNNABLE QUEUE
939: ;200000,,0 BIT MEANS QUEUE REQUIRES WAITING FOR THE SYSTEM RATHER THAN THE USER
940: 
941: QFUCKW:
942: QTW:    XWD 200000,-TQ
943: QRUNW:  XWD 200000,-RUNQ
944: QSTW:   XWD 600000,-STQ         ; SYST TAPE
945: QDTW:   XWD 600000,-DTQ         ; DEC TAPE
946: QDCW:   XWD 600000,-DCQ         ; DATA CONTROL WAIT
947: QMTW:   XWD 600000,-MTQ         ; MAG TAPE
948: QIOWW:  XWD 400000,-IOWQ        ; IOW(EXDEPT TTY) HELD IN IOWQ
949: QINTWW: XWD 400000,-INTWQ       ; INTERRUPT WAIT QUEUE
950: QDIOWW: XWD 600000,-DIOWQ
951: QNULW:  XWD 400000,-NULQ        ; NULL QUEUE JOB NO. NOT ASSIGNED
952: QSTOP:
953: QSTOPW: XWD 400000,-STOPQ       ; UNRUNABLE JOBS TO END OF STOPQ
954: QSEGW: XWD 600000,-SEGQ        ; SEGMENT WAIT QUEUE
955: QDWW:   XWD 400000,-DWQ         ; DEVICE WAIT GOES BACK TO DEVICE WAIT
    SCHEDU page# 0024 next  prev
957: IFN FTSWAP,<
958: ISCAN:  ;SCAN FOR INPUT
959:         XWD -SEGQ,QFOR  ; SEGMENT WAIT QUEUE
960:         XWD -TQ,QFOR    ; TELETYPE IO WAIT QUEUE
961:         XWD -RUNQ,QFOR
962:         XWD -DCQ,QFOR1
963:         XWD -STQ,QFOR1
964:         XWD -DTQ,QFOR1
965:         XWD -MTQ,QFOR1
966:         XWD -DCQ,QFOR2
967:         XWD -STQ,QFOR2
968:         XWD -DTQ,QFOR2
969:         XWD -MTQ,QFOR2
970:         0
971: 
972: ; TABLE TO DECIDE ON WHICH JOB TO SWAP OUT
973: OSCAN:  XWD -STOPQ,QBAK ;UNRUNABLE JOBS FIRST
974:         XWD -MTQ,QBAK1
975:         XWD -DTQ,QBAK1
976:         XWD -STQ,QBAK1
977:         XWD -DCQ,QBAK1
978:         XWD -MTQ,QFOR1
979:         XWD -DTQ,QFOR1
980:         XWD -STQ,QFOR1
981:         XWD -DCQ,QFOR1
982:         XWD -DWQ,QBAK
983:         XWD -INTWQ,QBAK
984:         XWD -IOWQ,QBAK
985:         XWD -RUNQ,QBAK
986:         XWD -TQ,QBAK
987:         0
988: 
989: ALLRUNSCAN:
990:         XWD -TQ,QFOR
991: RUNSCAN:
992:         XWD -RUNQ,QFOR
993:         0
994: 
995: DVWSCAN:
996:         XWD -DWQ,QFOR
997:         0
998: 
999: TQSCAN: XWD -TQ,QFOR
1000:         0
    SCHEDU page# 0025 next  prev
1002: ;HERE RESIDES ALL THE SWAP IN LIST CODE -- RPH 1/15/74
1003: 
1004: ;CALL WITH C(J)=JOB, C(TAC)=BIT TO SET
1005: SETSIN:CONO PI,PIOFF
1006:         SETZM SWPCNT                    ;RUN SWAPPER
1007:         TDNE TAC,JBTSIN(J)              ;BIT ON ALREADY?
1008:         JRST PIONJ                      ;YES, LEAVE
1009: IFN FTSTAT,<PUSH P,TAC
1010:         PUSH P,TAC1
1011:         JFFO TAC,.+1
1012:         LSH TAC1,6
1013:         MOVEI TAC,SINSTA+4000(TAC1)     ;SETTING BIT
1014:         PUSHJ P,STAPUT
1015:         POP P,TAC1
1016:         POP P,TAC
1017: >;FTSTAT
1018:         IORM TAC,JBTSIN(J)              ;TURN IT ON
1019:         ANDCA TAC,JBTSIN(J)             ;PICK UP ALL OTHER BITS
1020:         JUMPN TAC,PIONJ                 ;LEAVE IF ALREADY LINKED IN
1021:         LDB TAC,PSINB0                  ;PUT AT END OF LIST
1022:         DPB J,PSINB0                    ;NOW WE ARE END
1023:         DPB TAC,PSINBJ                  ;AND WE POINT TO OLD LAST
1024:         DPB J,PSINFT                    ;AND HE POINTS TO US
1025:         SETZ TAC,
1026:         DPB TAC,PSINFJ                  ;AND WE ARE END
1027:         JRST PIONJ                      ;ALL DONE
1028: 
1029: ;ENTER HERE WITH C(J)=JOB, C(TAC)=BIT(S) TO CLEAR
1030: CLRSIN:CONO PI,PIOFF
1031:         TDNN TAC,JBTSIN(J)              ;IN CASE SOMEONE SNUCK IN
1032:         JRST PIONJ
1033: IFN FTSTAT,<PUSH P,TAC
1034:         PUSH P,TAC1
1035:         JFFO TAC,.+1
1036:         LSH TAC1,6
1037:         MOVEI TAC,SINSTA(TAC1)          ;CLEARING BIT
1038:         PUSHJ P,STAPUT
1039:         POP P,TAC1
1040:         POP P,TAC
1041: >;FTSTAT
1042:         ANDCAB TAC,JBTSIN(J)            ;TURN OF REQUESTED BIT
1043:         TLNE TAC,-1                     ;ANY BITS LEFT ON?
1044:         JRST PIONJ                      ;YES, DON'T HAVE TO DE-LINK
1045:         LDB TAC,PSINFJ                  ;GET OUR FORWARD LINK
1046:         PUSH P,J                        ;USE J HERE
1047:         LDB J,PSINBJ                    ;AND OUR BACKWARD LINK
1048:         DPB J,PSINBT                    ;STORE OUR BACK IN OUR FORWARD
1049:         DPB TAC,PSINFJ                  ;AND OUR FORWARD IN OUR BACK
1050:         POP P,J
1051:         SETZM JBTSIN(J)                 ;ZERO FOR TESTS
1052:         JRST PIONJ                      ;ALL DONE
1053: 
1054: ;ENTER HERE WITH J SETUP TO FLUSH ALL SWAPIN BITS (DOESN'T CLOBBER ACS)
1055: FLUSIN:PUSH P,TAC                      ;KEEP THIS ROUTINE AUTONOMOUS
1056:         MOVE TAC,JBTSIN(J)
1057:         TLNN TAC,HLDSNB                 ;BITS WHICH MAY SET JHLDIN
1058:         PUSHJ P,FLUHLD                  ;FLUSH
1059:         TLNN TAC,JRDSNB
1060:         JRST FLUSN1
1061:         PUSHJ P,JRSRCH                  ;IF JOB READ BIT ON
1062:           JRDLOS                        ;SEND EVERYONE TO LOSE ROUTINE
1063: FLUSN1: MOVSI TAC,-1
1064:         PUSHJ P,CLRSIN                  ;CLEAR ALL BITS
1065:         POP P,TAC
1066:         POPJ P,
1067: 
1068: ;SEARCH FOR ALL OTHER JOBS TRYING TO READ THIS ONE (J)
1069: ;AND CALL SUBROUTINE FOLLOWING CALL ON JRSRCH
1070: JRSRCH:PUSH P,J
1071:         MOVEI J,JOBN-1                  ;SCAN ALL JOBS
1072: JRSRC1: HLRZ TAC,JBTFS(J)
1073:         CAME TAC,(P)
1074:         JRST JRSRC2
1075:         MOVE TAC1,@-1(P)                ;GET ROUTINE TO CALL
1076:         PUSHJ P,(TAC1)                  ;CALL IT
1077: JRSRC2: SOJG J,JRSRC1
1078:         POP P,J
1079:         JRST CPOPJ1                     ;SKIP ROUTINE NAME
1080: 
1081: ;FLUSH JHLDIN FROM UPPER OR LOWERS OF THIS JOB
1082: FLUHLD:PUSH P,TAC
1083:         PUSH P,J
1084:         MOVE TAC,JBTSTS(J)
1085:         TLNN TAC,JSEG                   ;SEGMENT?
1086:         JRST FLUHL1                     ;NO, EASY
1087:         MOVEI J,JOBN-1
1088: FLUHL2: LDB TAC,PSEGN                   ;GET HIS SEGMENT
1089:         CAME TAC,(P)                    ;DOES THIS JOB POINT TO US?
1090:         JRST FLUHL3                     ;NO
1091:         MOVSI TAC,JHLDIN
1092:         ANDCAM TAC,JBTSTS(J)
1093: FLUHL3: SOJG J,FLUHL2
1094: FLUHL4: POP P,J
1095:         POP P,TAC
1096:         POPJ P,
1097: 
1098: FLUHL1: LDB J,PSEGN
1099:         JUMPE J,FLUHL4                  ;ANY SEGMENT?
1100:         MOVSI TAC,JHLDIN
1101:         ANDCAM TAC,JBTSTS(J)            ;CLEAR BIT IN UPPER
1102:         JRST FLUHL4
1103: 
1104: ;CALLED FROM SCNIN TO SWAP GUYS IN JBTSIN IN FIRST
1105: GETSIN: SETZ J,
1106:         MOVEI QR,GETSN1
1107: GETSN1: LDB J,PSINFJ                    ;FOLLOW FORWARD LINK
1108:         JUMPN J,(PC)                    ;GOT ANOTHER JOB
1109:         JRST 1(PC)                      ;NO MORE
    SCHEDU page# 0026 next  prev
1111: SUBTTL  SWAP    4 AUG 67
1112: 
1113: ;SWAPPER CALLED EVERY CLOCK TIC.
1114: ;SINCE MOST OPERATIONS STARTED BY THE SWAPPER REQUIRE SEVERAL
1115: ;TICS TO RUN TO COMPLETION, SEVERAL FLAGS(FINISH,FIT,FORCE,
1116: ;XPANDF) ARE USED TO "REMEMBER" PREVIOUS STATES.
1117: ;THE BASIC ALGORITHM:
1118: ;IS CORE SHUFFLER WAITING FOR IO TO FINISH FOR SOME JOB?
1119: ;  YES--TRY AGAIN TO SHUFFLE(WHEN IO STOPS)
1120: ;IS CORE SHUFFLER STILL WAITING FOR IO TO FINISH?
1121: ;  YES--RETURN AND DO NOTHING
1122: ;IS SWAPPER STILL BUSY?
1123: ;  YES--RETURN AND DO NOTHING
1124: ;SCAN QS FOR 1ST JOB OUT OF CORE.
1125: ; IF NONE--RETURN
1126: ;A:
1127: ; IF ONE--WILL IT FIT IN LARGEST HOLE IN CORE?
1128: ;  YES--START INPUT AND RETURN
1129: ;  NO--IS TOTAL FREE CORE(CORTAL) ENOUGH TO ACCOMMODATE IT?
1130: ;    YES--CALL CORE SHUFFLER
1131: ;       IS SHUFFLER WAITING FOR IO TO STOP?
1132: ;         YES--RETURN AND DO NOTHING
1133: ;         NO--GO TO A:
1134: ;   NO--"REMBER" THIS JOB FOR INPUT AND LOOK FOR OUTPUT:
1135: ;ANY JOBS WAITING TO XPAND CORE BY SWAP OUT/IN?
1136: ; YES--OUTPUT ONE AND RETURN
1137: ; NO--SCAN QS BACKWARD FOR JOB IN CORE WHOSE PROTECT TIME
1138: ;               (SET ON INPUT) HAS GONE TO 0.
1139: ;  IF NONE--RETURN
1140: ;  IF ONE--IS IT SWAPPABLE?
1141: ;   YES--OUTPUT AND RETURN
1142: ;   NO--SET SWP BIT(FORCE JOB TO BECOME SWAPPABLE)--RETURN
1143: 
1144: 
1145: 
1146: 
1147: 
1148: 
1149: 
1150: 
1151: ;SOME DEVICE DEPENDENT CODE IS MARKED WITH A "*"
    SCHEDU page# 0027 next  prev
1153: SWAP:  PUSH PDP,[SWPXIT]       ; MAKE SURE WE EXIT THROUGH HERE
1154:         SOSLE SWPCNT            ;SHOULD WE RUN THE SWAPPER THIS TICK?
1155:         POPJ PDP,               ;NO.
1156:         MOVEI TAC,500           ; RUN THE SWAPPER EVERY SO OFTEN
1157:         MOVEM TAC,SWPCNT
1158:         SKIPE SHFWAT            ;IS CORE SHUFFLER WAITING FOR IO TO STOP
1159:                                 ;FOR SOME JOB?
1160:         PUSHJ PDP,CHKSHF        ;YES, CALL CORE SHUFFLER TO SEE IF
1161:                                 ;IO STOPPED YET
1162:         SKIPN SHFWAT            ;IS SHUFFLER STILL WAITING?
1163:         SKIPE SQREQ             ;*NO--IS SWAP SERV. ROUT. STILL BUSY?
1164:         POPJ PDP,               ;*YES--RETURN
1165:         SKIPN FBACT             ; ARE WE SWAPPING ON FAST BANDS TODAY?
1166:         JRST .+3                ; NO, FORGET IT
1167:         SKIPE SWPBSY            ; YES, IS THE FAST BANS SWAPPER STILL BUSY?
1168:         POPJ PDP,               ; YES, COME BACK LATER
1169: FINSWP: SKIPN J,FINISH          ;NO--ANY IN/OUTPUT TO FINISH?
1170:         JRST SWP2               ;NO-
1171:         SETZM SWPCNT            ; SET TO RESCAN NEXT TIME AROUND
1172:         JUMPL J,FINOUT          ;YES--INPUT OR OUTPUT?
    SCHEDU page# 0028 next  prev
1174: ; WE COME HERE TO FINISH A SWAPPING INPUT REQUEST
1175: 
1176: FININ:
1177:         MOVEM J,LASTIN#
1178: ;RESTORE PARTS OF HIS JOB DATA AREA FROM JBTPDL IF IT WAS SAVED THERE....
1179:         MOVE    DAT,JBTSTS(J)   ;GET STATUS
1180:         TLNN    DAT,JSEG        ;SKIP IF THIS IS A SEGMENT
1181:         TRZN    DAT,SAVJDA      ;NOT A SEGMENT. DOES HE HAVE A DATA AREA SAVED?
1182:         JRST    FININA          ;SEGMENT OR NOT SAVED IN PDL
1183:         SKIPN   JBTPDL(J)
1184:         JRST    FININA          ;CANT BE IN THE PDL IF THERE'S NO PDL.
1185: 
1186:         MOVEM   DAT,JBTSTS(J)   ;NOT SAVED ON PDL ANYMORE.
1187:         HRLZ    TAC1,JBTPDL(J)  ;SOURCE (SORT OF)
1188:         HRR     TAC1,JBTDAT(J)  ;DESTINATION (SORT OF)
1189:         ADD     TAC1,[<JBTPLN+JOBPRT-JOBPFI>,,JOBPRT]   ;ADD OFFSETS.
1190:         HRRZ    DAT,JBTDAT(J)
1191:         BLT     TAC1,JOBPFI(DAT);RESTORE JOB DATA AREA TO USER CORE.
1192:         
1193: FININA: SKIPE   DAT,SERA        ;ANY INPUT ERRORS?
1194:         JRST    INERR           ;YES
1195:         LDB     DAT,IMGOUT      ;*INPUT--RETURN STORAGE TO DEVICE
1196:         HLRZ    TAC,JBTSWP(J)   ;*1ST BLOCK ADDR.
1197:         PUSHJ   P,FXSAT         ;*
1198:         MOVE    JDAT,JBTDAT(J)
1199: IFN JDMPRG,<
1200:         MOVE    PROG,JBTADR(J)
1201: >
1202:         MOVE    DDB,JBTSTS(J)   ;IS THIS A HIGH SEGMENT?
1203:         TLNN    DDB,JSEG
1204:         JRST    FININ5          ;NOT A SEGMENT.
1205:         PUSHJ   P,UAPPLY        ;FOR ALL LOWERS OF THIS UPPER,
1206:          PUSHJ  P,SPWCNT        ;CONTINUE SPACEWAR (ARGUMENT TO UAPPLY)
1207:         SKIPN   AC1,SEGWAIT     
1208:         JRST    FININ1          ;SEGWAIT WASN'T SET.
1209:         LDB     AC1,[POINT 6,JBTSTS(AC1),35]
1210:         CAIE    AC1,(J)         ;WAS THAT GUY WAITING FOR US?
1211:         JRST    FININ1          ;NO. SEGWAIT WASN'T SET ON OUT ACCOUNT
1212:         SETZM   SEGWAIT         ;IT WAS OUR FAULT. CLEAR SEGWAIT
1213:         MOVNI   AC1,STOPQ
1214:         MOVEM   AC1,JOBQUE(J)
1215:         PUSHJ   P,REQUE         ;QUEUE THIS SEGMENT BACK TO STOPQ
1216:         JRST    FININ1
    SCHEDU page# 0029 next  prev
1218: ; HERE WE CONTINUE ANY SPW JOB THAT WAS ACTIVE AND GIVE SWAPIN INTS
1219: ; NOTE HERE THAT THE ONLY WAY I KNOW THAT A JOB WITH SPW ACTIVE CAN
1220: ; GET SWAPPED OUT IS IF IT EXPANDS ITS CORE SIZE, OR IF THE FREE
1221: ; STORAGE MECHANISM NEEDS THE 1K BLOCK THE JOB IS SITTING ON.
1222: 
1223: FININ5: PUSHJ P,SPWCNT          ; CONTINUE ITS SPW JOB, IF ANY
1224:         MOVE DDB,JOBPC(JDAT)
1225:         TLNE DDB,USRMOD
1226:         JRST FININ1             ;NO
1227:         HRRZ DDB,JOBDPG(JDAT)   ;YES, ADJUST PROG AND PDP IN DUMP AC AREA
1228:         SUBI DDB,(PROG)         ;OLD RELOC-NEW RELOC
1229:         MOVNS DDB               ;NEW RELOC-OLD RELOC
1230:         HRRZ DSER,JOBDAC+PDP(JDAT); SEE IF DUMP PDL IS IN USER'S AREA
1231:         CAMLE DSER,SYSSIZ       ; IS IT ABOVE SYSTEM
1232:         CAML DSER,MEMSIZ        ; AND BELOW FREE STORAGE AREA?
1233:         JRST FINZR2             ; NO
1234:         ADDM DDB,JOBDAC+PDP(JDAT)       ; YES, RELOCATE PDL
1235: FINZR2: MOVEM PROG,JOBDPG(JDAT) ;STORE NEW AC PROG
1236: FININ1: LDB DSER,PSEGN          ; # OF UPPER
1237:         JUMPE DSER,FINZRL       ;NONE IF 0
1238:         MOVE DDB,JBTSTS(DSER)
1239:         HLRZ DSER,JBTADR(DSER)  ;PROTECTION OF UPPER
1240:         JUMPN DSER,FINZR1
1241:         LDB DSER,PSEGN
1242:         LDB DSER,[POINT 8,JBTSWP(DSER),35]
1243:         ASH DSER,12
1244:         SUBI DSER,1
1245: FINZR1: TLNE DDB,JWP
1246:         TLO DSER,400000         ;FLAG WRITE PROT
1247:         TRO DSER,400000         ;MAKE IT UPPER SEG ADDR
1248: FINZRL: MOVSI DDB,SWP           ;CLEAR SWP BIT
1249:         ANDCAB DDB,JBTSTS(J)
1250:         TLNN DDB,JSEG           ;ONLY SET JOBRL2 FOR LOWERS
1251:         CAMN DSER,JOBRL2(PROG)  ;AND SEE IF ITS REALLY NECESSARY
1252:         JRST FINZ1A
1253:         SKIPE JBTPR2(J)
1254:         JRST FINZ1A             ;AVOID CLOBBERING PEEK-POKE JOBRL2
1255:         SETOM STIME(J)          ;MARK CORE IMAGE MODIFIED IF CHANGED
1256:         MOVEM DSER,JOBRL2(PROG) ;SET NEW SEG2 JOBREL
1257: FINZ1A: HRRE    DSER,JBTLIN(J)
1258:         JUMPL   DSER,FINDET     ;DETACHED?
1259:         MOVSI   DDB,DLYBIT
1260:         CONO    PI,SCNOFF       ;KEEP TTYSER OUT
1261:         TDNN    DDB,TTYTAB(DSER);WAS HE DELAYED?
1262:         JRST    NOTSET          ;NO.
1263:         MOVSI   DDB,COMBIT
1264:         TDNE    DDB,TTYTAB(DSER);COMMAND ALREADY IN?
1265:         JRST    NOTSET          ;YES
1266:         AOS     COMCNT          ;NOW LOOK AT HIM AGAIN!
1267:         IORM    DDB,TTYTAB(DSER);SET BIT
1268: IFN FTTTYBUG,<
1269:         PUSHJ   P,COMBCK
1270:         PUSHJ   P,CNTCOM        ;MAKE SURE ALL IS WELL
1271: >
1272: NOTSET: CONO PI,SCNON
1273: FINDET: MOVSI DSER,INTSWD
1274:         TDNN DSER,JBTIEN(J)
1275:         JRST FININ2
1276:         IORM DSER,JBTIRQ(J)
1277:         PUSH P,J
1278:         PUSHJ P,INTRUN
1279:         POP P,J
1280: FININ2:
    SCHEDU page# 0030 next  prev
1282: ; WE CLEAR JOB DATA AREA IF REQUIRED ALSO
1283: 
1284:         SETZM STIME(J)          ; MARK FRESH IMAGE IN CORE
1285:         SKIPN   BLTSWP          ;ARE WE TESTING CORE IMAGE AFTER SWAP IN?
1286:         JRST    FINAFB          ;NO.
1287:  
1288:         SETCM   DDB,JBTADR(J)   ;- SIZE IN LEFT
1289:         HRR     DDB,JBTADR(J)   ;GET ADDRESS IN RIGHT
1290:         JUMPL   DDB,.+3
1291:         MOVE    DSER,(DDB)
1292:         AOBJP   DDB,.-1
1293:         MOVE    DSER,(DDB)
1294:         AOBJN   DDB,.-1
1295: 
1296: FINAFB: MOVE DDB,JBTSTS(J)      ; PICK UP JOB STATUS WORD AGAIN(MAY BE CLOBBERED BY INTRUN)
1297:         TRZN DDB,WIPEJD         ; MUST WE WIPE THE JOB DATA AREA?
1298:         JRST FININS             ; NO, GO AHEAD
1299:         HRRM DDB,JBTSTS(J)
1300:         MOVE PROG,JBTADR(J)
1301:         PUSHJ P,CLRINI
1302: FININS:
    SCHEDU page# 0031 next  prev
1304: ;HERE WE CHECK ALL THE SWAPIN BITS
1305:         HLRZ TAC,JBTSIN(J)
1306:         JUMPE TAC,NSINBT        ;NO JBTSIN BITS ARE SET. SKIP THIS STUFF.
1307:         PUSH P,J
1308:         MOVSI TAC,HLDSNB        ;BITS WHICH MAY CAUSE JHLDIN TO BE SET ELSEWHERE
1309:         TDNE TAC,JBTSIN(J)
1310:         PUSHJ P,FLUHLD          ;FLUSH
1311:         MOVSI TAC,INTSNB
1312:         TDNN TAC,JBTSIN(J)      ;INTERRUPT HANDLER TRYING TO GET HIM IN?
1313:         JRST NOSINT             ;NO
1314:         PUSHJ P,CLRSIN          ;YES, TURN OFF BIT
1315:         PUSH P,HGCODE
1316:         MOVEI TAC,7
1317:         MOVEM TAC,HGCODE
1318:         PUSHJ P,INTRUN
1319:         POP P,HGCODE
1320:         MOVE J,(P)              ;RESET J
1321: NOSINT: MOVSI TAC,BATSNB        ;PHANTON TRYING TO START UP?
1322:         TDNN TAC,JBTSIN(J)
1323:         JRST NOSBAT
1324:         PUSHJ P,CLRSIN
1325:         PUSHJ P,BATSW           ;FINISH HIM OFF
1326:         MOVE J,(P)
1327: NOSBAT: MOVSI TAC,JRDSNB        ;JOB READ?
1328:         TDNN TAC,JBTSIN(J)
1329:         JRST NOSJRD
1330:         PUSHJ P,CLRSIN
1331:         PUSHJ P,JRSRCH          ;FIND EVERYONE TRYING TO READ THIS JOB
1332:          JRDWIN                 ;AND SEND THEM HERE
1333:         MOVE J,(P)
1334: NOSJRD: MOVSI TAC,COMSNB        ;COMMAND WAIT?
1335:         TDNN TAC,JBTSIN(J)
1336:         JRST NOSCOM
1337:         PUSHJ P,CLRSIN
1338:         PUSH P,HGCODE
1339:         MOVEI TAC,1
1340:         MOVEM TAC,HGCODE
1341:         SKIPE COMCNT
1342:         PUSHJ P,COMMAND         ;CALL COMMAND DECODER (NOTE THIS MAY NOT GET THE RIGTH GUY)
1343:         POP P,HGCODE
1344: NOSCOM: POP P,J
1345:         MOVSI TAC,SPWSNB
1346:         TDNE TAC,JBTSIN(J)      ;FORCED OUT BY FS OR LOCK AND SPACEWAR ACTIVE?
1347:         PUSHJ P,CLRSIN          ;YES. JUST CLEAR BIT.
1348: NSINBT: 
    SCHEDU page# 0032 next  prev
1350: ;CHECK IF UPPER WANTS IN
1351:         MOVE DSER,J
1352:         LDB J,PSEGN             ; DOES THIS JOB HAVE AN UPPER?
1353:         JUMPE J,SWAPSCAN        ; NO, SCAN FOR MORE INPUT
1354:         MOVE DDB,JBTSTS(J)
1355:         TLNN DDB,SWP            ; IS HIGH SEGMENT SWAPPED OUT?
1356:         JRST SWAPSCAN           ; NO
1357:         MOVM UCHN,JOBQUE(DSER)
1358:         CAIE UCHN,RUNQ          ;LOWER RUNABLE?
1359:         CAIN UCHN,TQ
1360:         PUSHJ P,FININ7          ;YES, CAUSE UPPER TO COME IN
1361:         LDB TAC,IMGIN           ; NOW, CAN UPPER FIT IN NOW?
1362:         CAMG TAC,BIGHOL
1363:         JRST INJOB              ; YES, GET IT
1364:         JRST SWAPSCAN
1365: 
1366: FININ7: MOVNI DAT,SEGQ
1367:         MOVEM DAT,JOBQUE(J)
1368:         SKIPN SEGWAIT
1369:         MOVEM DSER,SEGWAIT      ; MAKE SURE THIS GUY STAYS AROUND!
1370:         MOVEI DAT,QSEGW
1371:         JRST QXFER
    SCHEDU page# 0033 next  prev
1373: ;HERE THERE'S A SWAPIN ERROR.
1374: 
1375: INERR:  SKIPN   FBACT                   ;LIBRASCOPE FAST BANDS?
1376:         TRNE    DAT,IODTER!IODERR       ;NO. IBM DISK.  ANY ERRORS?
1377:         JRST    .+2                     ;L'SCOPE OR IBM ERRORS.
1378:         JRST    FININ8                  ;GO TRY DOING INPUT AGAIN.
1379:         MOVE    DDB,JBTSTS(J)
1380:         TLNN    DDB,JSEG
1381:         JRST    INERNS                  ;THIS WAS A LOWER.
1382:         SKIPE   FBACT
1383:         SKIPE   FIRSTOUT
1384:         JRST    INERNS                  ;WE HAVE NO SPARE COPY (THAT WORKS)
1385: ;THIS IS A WRITE PROTECTED UPPER. TRY TO SWAP IN THE SPARE.
1386:         SETOM   FIRSTOUT                ;FLAG TO AVOID COMING HERE AGAIN.
1387:         SETZM   SERA                    ;CLEAR SWAPPER ERROR FLAG
1388:         LDB     DDB,IMGIN               ;THIS IS LIFTED DIRECTLY FROM INJOB
1389:         LDB     TAC,IMGOUT
1390:         CAML    DDB,TAC
1391:         MOVE    DDB,TAC
1392:         LSH     DDB,=18+=10
1393:         MOVN    TAC1,DDB
1394:         HRR     TAC1,JBTADR(J)
1395:         MOVE    DAT,[XWD J,JB2SWP]
1396:         HLRZ    DSER,JBTSWP(J)
1397:         ADDI    DSER,1
1398:         HRRZS   JBTSWP(J)               ;NO PRIMARY SWAPPING BANDS IN USE
1399:         JRST    FBIREQ
1400: 
1401: FININ8: SETZM   FIRSTOUT                ;FOR IBM DISK ERRORS, WE TRY AGAIN
1402:         SETZM   FIT
1403:         JRST    INJO1
    SCHEDU page# 0034 next  prev
1405: ;ERROR AND NOT WRITE PROTECTED SEGMENT, OR LOWER.
1406: 
1407: INERNS: PUSHJ P,FLUSIN
1408:         MOVE DDB,JBTSTS(J)      ; IS THIS A HIGH SEGMENT?
1409:         TLNN DDB,JSEG
1410:         JRST INERR7             ;NO.
1411: 
1412:         MOVSI DDB,SWP           ; YES, CALL KILSEG ON ALL JOBS THAT POINT TO THIS SEGMENT
1413:         ANDCAM DDB,JBTSTS(J)
1414:         MOVE AC1,PRJPRG(J)
1415:         MOVEM AC1,JOBNAM(J)     ; MAKE SURE NO ONE WILL ATTATCH TO HIM
1416: IFN FTSTAT,<PUSHJ P,NAMSTT>
1417: 
1418:         PUSHJ   P,UAPPLY
1419:          PUSHJ  P,SEGERR        ;CALL SEGERR FOR EACH LOWER.
1420:         JRST    SWAPSCAN
1421: 
1422: 
1423: ;TRY TO RECONSTRUCT JOB DATA AREA
1424: 
1425: INERR7: MOVE PROG,JBTADR(J)
1426:         SETZ DAT,
1427:         SKIPN TAC,JOBHCU(PROG)  ; ANY IO CHANNELS?
1428:         JRST INERC0             ; NO, REGENERATE ANY WHAT MAY EXIST
1429:         MOVEI TAC1,JOBJDA(PROG) ; SCAN THEM ALL AND CHECK FOR VALIDITY
1430:         HRLI TAC1,TAC
1431: INERJL: SKIPN DDB,@TAC1         ; PICK UP ADDRESS OF IO DDB
1432: INERJ1: SOJGE   TAC,INERJL
1433:         JUMPL   TAC,INERCN      ;IF ALL CHECKED OUT OK, GO ON
1434:         HRRZ    DDB,DDB
1435:         CAIL    DDB,CHKBEG      ;DDB IN SYSTEM LOW CORE?
1436:         CAML    DDB,MEMSIZ      ;NO. IN FREE STORAGE?
1437:         CAML    DDB,RMEMSIZ     ;MUST BE IN PHYSICAL CORE.
1438:         AOJA    DAT,INERR1      ;LOSER.
1439:         AOJA    DAT,INERJC      ;IS OK.
    SCHEDU page# 0035 next  prev
1441: ; HERE WE CHECK THE NUMBER OF DDB'S HE HAS, ALSO REGENERATE JOB DATA AREA
1442: 
1443: INERC0: SETZM JOBJDA(PROG)      ; MAYBE NO CHANNELS??????
1444: INERCN: SETZ TAC,
1445:         HLRZ DDB,DEVLST         ; COUNT NUMBER OF DDB'S ON CHAIN THAT ARE HIS
1446: INERC1: MOVE AC1,DEVMOD(DDB)
1447:         TRNN AC1,ASSPRG         ; DOES HE HAVE IT INITED?
1448:         JRST INERC2
1449:         LDB AC1,PJOBN
1450:         CAIN AC1,(J)
1451:         ADDI TAC,1
1452: INERC2: HLRZ DDB,DEVSER(DDB)
1453:         JUMPN DDB,INERC1
1454:         CAIN DAT,(TAC)          ; DID WE CHECK AS MANY AS WE FOUND?
1455:         JRST INERR4             ; YES, ALL IS WELL
1456:         JRST INERR1             ; NO, REGENERATE DATA AREA
1457: 
1458: INERJC: LDB AC1,PJOBN           ; NOW CHECK JOB NUMBERS
1459:         CAIN AC1,(J)
1460:         JRST INERJ1
1461: INERR1: MOVE PROG,JBTADR(J)
1462:         PUSHJ P,CLRJB1          ; CLEAN IT OUT
1463:         SETZM JOBHCU(PROG)
1464:         MOVEI DSER,JOBJDA(PROG)
1465:         HLRZ DDB,DEVLST
1466: INERR2: SETZM (DSER)
1467:         MOVE UCHN,DEVMOD(DDB)
1468:         TRNN UCHN,ASSPRG        ; DOES HE HAVE IT INITED??
1469:         JRST INERR3
1470:         LDB UCHN,PJOBN          ; DOES THIS DDB BELONG TO HIM?
1471:         CAME UCHN,J
1472:         JRST INERR3
1473:         MOVEM DDB,(DSER)        ; YES, PUT ITS ADDRESS IN JOBJDA
1474:         AOS JOBHCU(PROG)
1475:         ADDI DSER,1
1476: INERR3: HLRZ DDB,DEVSER(DDB)    ; MOVE DOWN TO NEXT DDB
1477:         JUMPN DDB,INERR2
1478:         PUSHJ P,ESTOP
1479: INERR4: MOVE DSER,JOBHCU(PROG)
1480:         MOVSI DAT,GOBIT
1481: INERRG: MOVEI DDB,JOBJDA(PROG)
1482:         ADD DDB,DSER
1483:         MOVE DDB,(DDB)
1484:         MOVE UCHN,DEVMOD(DDB)
1485:         TLNE UCHN,DVDSK!DVUDP
1486:         ANDCAM DAT,DEVIOS(DDB)  ;CLEAR GOBIT SO USER DOESN'T HANG
1487:         SOJGE DSER,INERRG
1488:         MOVM J,FINISH
1489: INERR6: MOVSI DDB,SWP
1490:         ANDCAM DDB,JBTSTS(J)
1491:         SETZM XPANDF
1492:         SETZM FINISH
1493: SEGERR: CAMN J,SEGWAIT
1494:         SETZM SEGWAIT
1495:         PUSHACS
1496:         PUSHJ   P,DISMES
1497:         ASCIZ   /
1498: SWAP READ ERROR /
1499:         PUSHJ   P,DISJOB
1500:         PUSHJ   P,DISCRLF
1501:         POPACS
1502:         PUSHJ P,TTYERP
1503:         PUSHJ P,INLMES
1504:         ASCIZ /SWAP READ ERROR/
1505:         PUSHJ P,PRCRCC
1506:         PUSHJ P,TTYSTC
1507:         MOVE AC1,JBTSTS(J)
1508:         TLNE AC1,JLOG           ; IS HE REALLY LOGGED IN?
1509:         JRST STOP1
1510:         JRST ESTOP
    SCHEDU page# 0036 next  prev
1512: ; ROUTINE TO RELEASE A JOB'S SWAPPING BANDS (LIBRASCOPE ONLY)
1513: 
1514: GIVEBANDS:
1515:         SKIPN FBACT
1516:         POPJ P,
1517:         HLRZ UCHN,JB2SWP(J)
1518:         SKIPN UCHN
1519:         HLRZ UCHN,JBTSWP(J)
1520: INERX:  PUSHJ P,FBGIVE
1521:         CAIE UCHN,MAXFB
1522:         SOJA UCHN,INERX
1523:         HRRZS JBTSWP(J)
1524:         HRRZS JB2SWP(J)
1525:         POPJ P,
    SCHEDU page# 0037 next  prev
1527: ; AND HERE IS WHERE WE GO TO FINISH A SWAP OUTPUT REQUEST
1528: 
1529: FINOUT:
1530:         MOVNS J                 ;FINISH OUTPUT, -FINISH=JOB NO.
1531:         SKIPN SERA              ;ANY ERRORS
1532:         JRST FINOU1
1533:         PUSHJ P,GIVEBANDS       ; RELEASE ALL HIS BANDS AND TRY AGAIN
1534:         JRST OUTJOB
1535: 
1536: FINOU1: SKIPE FBACT
1537:         SKIPE FIRSTOUT
1538:         JRST OUTP1
1539:         MOVE DDB,JBTSTS(J)
1540:         TLNN DDB,JSEG
1541:         JRST OUTP1
1542:         SETOM FIRSTOUT
1543:         HLRZ DDB,JBTADR(J)
1544:         MOVNM DDB,TAC           ; IF A WRITE-PROTECTED UPPER, SWAP OUT A SPARE COPY
1545:         HRRZ TAC1,JBTADR(J)
1546:         HRLI TAC1,-1(TAC)
1547:         MOVE DAT,[XWD J,JB2SWP]
1548:         HLRZ DSER,JBTSWP(J)
1549:         ADDI DSER,1
1550:         JRST FBOREQ
1551: 
1552: OUTP1:  MOVEI TAC,0             ;RETURN CORE
1553:         MOVE PROG,JBTADR(J)     ;XWD PROTECT.,RELOC.
1554: IFN JDMPRG,<
1555:         MOVE JDAT,JBTDAT(J)     ;JOB DATA AREA
1556: >
1557:         PUSHJ PDP,CORE0
1558:         JSP DAT,CERROR          ;SHOULD NEVER HAPPEN
1559:         SKIPN   FSCLKF          ;FREE STORAGE FORCING USERS?
1560:         SKIPE   LOCKNO          ;NO. LOCK UUO FORCING?
1561:         TDZA    TAC,TAC         ;THIS GUY IS BEING FORCED BY FS OR LOCK (ZERO TAC) 
1562:         JRST    SWAPSCAN
1563:         MOVE    DDB,JBTSTS(J)
1564:         TLNE    DDB,JSEG        ;SEGMENT?
1565:         PUSHJ   P,UAPPLY        ;YES. APPLY ROUTINE TO ALL LOWERS
1566:         PUSHJ   P,PSPWAC        ;IS SPACEWAR ACTIVE FOR THIS USER? (SET TAC)
1567:         JUMPE   TAC,SWAPSCAN    ;NO.
1568:         PUSHJ   P,SETSIN        ;FORCE THIS GUY TO GET SWAPPED IN
1569: 
1570: SWAPSCAN:
1571:         SETZM   XPANDF          ;CLEAR XPANDING JOB OUTPUT TO DISK FLAG
1572:         SETZM   FINISH          ;CLEAR FINISH FLAG
1573: SWP2:   SKIPE   J,FORCE         ;WAITING FOR JOB TO BECOME SWAPPABLE?
1574:         JRST    FORCE1          ;YES
1575:         SETZM   FIT             ;RESCAN FOR INPUT NEXT TIME
1576:         SKIPE   XJOB            ;IS THERE SOMEONE WHO WANTS TO BE KICKED OUT?
1577:         JRST    SCNIN           ;YES.  SCNIN WILL DO IT (BELIEVE IT OR NOT)
1578:         SKIPGE  FSCLKF          ;ARE WE WAITING FOR FREE STORAGE?
1579:         POPJ    P,              ;YES.
1580:         SKIPG   J,LOCKNO        ;ARE WE WAITING FOR A JOB TO BE LOCKED IN?
1581:         JRST    SCNIN           ;NO.
1582:         MOVE    DDB,JBTSTS(J)   ;IS THE LOCKING JOB STILL IN CORE?
1583:         TLNN    DDB,SWP         ;
1584:         POPJ    P,              ;JOB IS STILL IN CORE. FOREGO SWAPIN UNTIL LOCKNO=0
1585:         JRST    SCNINX          ;J AND DDB ARE SET TO GET THIS GUY IN.
1586: 
1587: 
1588: PSPWAC: SKIPN   SPWGO(J)
1589:         SKIPE   SP2GO(J)
1590:         MOVSI   TAC,SPWSNB      ;INDICATE WE HAVE SPACEWAR ACTIVE
1591:         POPJ    P,
    SCHEDU page# 0038 next  prev
1593: ;SCAN FOR INPUT - LOOK FOR A JOB ON THE DISK WHICH OUGHT TO COME IN.
1594: JN←←TEM
1595: 
1596: SCNIN:
1597:         HGMAC   (2)             ;TELL HG ROUTINES WE ARE IN SCNIN
1598: 
1599: ;FORCE EXPANDING JOBS OUT before SCAN FOR INPUT
1600:         PUSHJ   P,XPAND1        ;CHECK XPANDING JOB FIRST
1601:         SKIPN   SQREQ           ;*WERE THERE ANY?
1602:         SKIPE   FORCE
1603:         POPJ    P,              ;YES
1604:         SKIPN   FBACT           ; ARE WE SWAPPING IN FBPACK TODAY?
1605:         JRST    .+3             ; NO
1606:         SKIPE   SWPBSY          ; YES, IS THE FBPACK SWAPPER BUSY?
1607:         POPJ    P,              ; YES, LEAVE NOW
1608: 
1609:         PUSHJ P,GCMAX           ;GET TOTAL AMOUNT OF AVAILABLE CORE (CORE IS 
1610:         MOVEM AC3,CORMX         ;AVAILABLE IF NOT OCCUPIED BY SYSTEM OR SPW JOBS)
1611:                                 ;OR LOCKED CORE.
1612:         JSP PC,GETSIN
1613:         JRST SCNINZ             ;FOUND A JOB IN SWAP IN LIST
1614:         MOVEI DAT,ISCAN         ;NO MORE IN SWAP IN LIST, TRY QUEUES
1615:         JSP PC,QSCAN            ;C(J)← NEXT MOST IMPORTANT JOB TO SWAP IN
1616:         POPJ    P,              ;(THERE IS NO NEXT MOST IMPORTANT JOB)
1617: SCNINZ: MOVE DDB,JBTSTS(J)      ;THIS JOB OUT OF CORE?
1618:         TLNN DDB,SWP
1619:         JRST (QR)               ;NO--CONTINUE SCAN
1620:         
1621: SCNINX: LDB TAC,IMGIN           ;YES--WILL IT FIT IN BIGGEST HOLE?
1622: SCNIN1:
1623: IFN FTSTAT,<
1624:         PUSH P,TAC
1625:         MOVEI TAC,FITSTA
1626:         PUSHJ P,STAPUT
1627:         POP P,TAC
1628: >;FTSTAT
1629:         CAMG TAC,BIGHOL
1630:         JRST INJOB              ;YES
1631:         MOVEM J,FIT             ;NO--SET FIT FLAG
1632:         
1633:         
1634: SCNIN2: MOVE DDB,JBTSTS(J)
1635:         TLNE DDB,JSEG           ;IS THIS JOB AN UPPER SEGMENT?
1636:         JRST DEADUP             ;  YES
1637:         LDB DDB,PSEGN           ;GET NUMBER OF THIS JOB'S UPPER SEGMENT
1638:         MOVE DSER,JBTSTS(DDB)
1639:         TLNN DSER,SWP           ;IS UPPER SEGMENT IN CORE?
1640:         JRST DEADR1             ;  YES, (OR ELSE THERE IS NO UPPER)
1641:         LDB DSER,IMGINT         ;C(DSER) ← INCORE IMAGE SIZE OF THE UPPER
1642:         ADD TAC,DSER            ;C(TAC) ← CORZ SIZE OF SWAPPED OUT PORTION OF JOB
1643: DEADR1: MOVE AC3,CORMX          ;AC3 ← TOTAL CORE SPACE AVAILABLE TO OUR JOB
1644:         SKIPN TAC1,DDB          ;DOES THIS JOB HAVE AN UPPER SEGMENT?
1645:         JRST DEADR9             ;  NO
1646:         PUSHJ P,GCMCK           ;  YES, IS IT'S SIZE ALREADY REFLECTED IN CORMX?
1647:         JRST DEADR9             ;  YES
1648:         PUSHJ P,CORSGT          ;  NO, C(TAC1) ← SIZE OF UPPER SEGMENT
1649:         SUB AC3,TAC1            ;AC3 ← (AVAILABLE CORE) - (UPPER CORE SIZE)
1650: DEADR9: LDB DDB,IMGIN
1651:         LSH DDB,=10             ;DDB ← CORE SIZE OF JOB (LOWER SEG ONLY)
1652:         CAMG DDB,AC3            ;WILL WE FIT INTO AVAILABLE CORE?
1653:         JRST SCNIN9             ;  YES
1654:         PUSHJ P,DEADLOCK        ;  NO
1655:         JRST (QR)               ;CONTINUE SCAN FOR A JOB TO SWAP IN
    SCHEDU page# 0039 next  prev
1657: ; "DEADUP" IS CALLED FROM NEAR SCNIN2, IF THE JOB TO BE SWAPPED IN IS AN
1658: ;UPPER SEGMENT AND NO SINGLE HOLE IS LARGE ENOUGH TO CONTAIN IT;
1659: ;       CODE BY JAM             COMMENTS BY JHS
1660: 
1661: DEADUP: SETZB DSER,JN
1662:         SETZM ISONE
1663:         MOVE DDB,J
1664:         MOVEI J,JOBN-1          ;SCAN JOB TABLE, LOOKING FOR OUR LOWERS
1665: DEADU1: LDB UCHN,PSEGN
1666:         CAIE UCHN,(DDB)         ;IS THIS JOB POINTING TO US?
1667: DEADU2: SOJG J,DEADU1           ;  NO, CONTINUE SCAN
1668:         JUMPE J,DEADU3          ;JUMP WHEN SCAN COMPLETED
1669:         MOVE UCHN,JBTSTS(J)
1670:         TLNN UCHN,JHLDIN        ;LOWER HOLDING?
1671:         SKIPE JBTSIN(J)
1672:         JRST DEADU7             ;COMING IN
1673:         MOVM UCHN,JOBQUE(J)     ;IF OUR LOWER IS
1674:         CAIE UCHN,RUNQ          ;IN RUNQ OR TQ
1675:         CAIN UCHN,TQ            ;THEN GO TO DEADU7
1676:         JRST DEADU7             ;ELSE CONTINUE SCAN
1677:         MOVE UCHN,JBTMSK(J)
1678:         AND UCHN,JBTIEN(J)
1679:         AND UCHN,JBTIRQ(J)
1680:         JUMPN UCHN,DEADU7
1681:         SKIPN JBTST2(J)
1682:         JRST DEADU2             ;NONE OF THE ABOVE, CONTINUE SCAN
1683: DEADU7: MOVE TAC1,JBTSTS(J)
1684:         TLNE TAC1,SWP           ;THIS LOWER OF OURS IS SWAPPED OUT?
1685:         JRST DEADUC             ;       YES
1686:         HLRZ TAC1,JBTADR(J)
1687:         ADDI TAC1,1
1688:         LDB UCHN,IMGINT
1689:         LSH UCHN,=10
1690:         ADDI TAC1,(UCHN)        ;C(TAC1) ← COMBINED SIZE OF LOWER AND UPPER
1691:         CAMG TAC1,CORMX         ;BOTH WILL FIT IN CORE AT ONE TIME?
1692:         SETOM ISONE             ;  YEP, INDICATE THAT THERE ISONE THAT FITS
1693: DEADUC: MOVE TAC1,J
1694:         PUSHJ P,CORSGT          ;C(TAC1) ← SIZE OF LOWER
1695:         CAMG TAC1,DSER          ;HAS SUCH A LARGE LOWER BEEN FOUND BEFORE?
1696:         JRST DEADU2             ;  NO, CONTINUE SCAN FOR LOWERS
1697:         MOVE DSER,TAC1          ;  YES, REMEMBER SIZE IN DSER
1698:         MOVE JN,J               ;   AND REMEMBER JOB# IN JN
1699:         JRST DEADU2             ;       AND CONTINUE SCAN
1700:         
1701: DEADU3: JUMPN JN,DEADU4         ;ARRIVE HERE WHEN SCAN FOR LOWERS COMPLETE
1702:         MOVE J,DDB              ;ARRIVE HERE IF WE HAVE NO LOWERS ! (?)
1703:         JRST (QR)               ;DON'T BRING IN UPPER, LOOK FOR SOME OTHER
1704:                                 ;  JOB TO SWAP IN
    SCHEDU page# 0040 next  prev
1706: ; THIS SENDS THE MESSAGE TO A DEADLOCKED LOWER
1707:         
1708: DEADU4: MOVE J,JN               ;C(JN) = JOB# OF LARGEST LOWER SEGMENT
1709:         MOVE UCHN,TAC           ;C(TAC) = SIZE OF UPPER SEGMENT
1710:         LSH UCHN,=10
1711:         ADD UCHN,DSER
1712:         CAMG UCHN,CORMX         ;WILL LARGEST LOWER BE LOCKED OUT?
1713:         JRST SCNIN9             ;  NO, GO SHUFFLE ETC.
1714:         PUSH P,DDB              ;  YES, ETC.
1715:         CAMN J,SEGWAIT
1716:         SETZM SEGWAIT
1717:         PUSHJ P,DEADLOCK
1718:         POP P,J
1719:         SKIPN ISONE
1720:         JRST (QR)
1721:         JRST SCNIN9
1722: 
1723:                 ;NOTE:  IF MORE THAN ONE LOWER IS SO LARGE THAT
1724:                 ;  IT TOGETHER WITH THE UPPER WON'T FIT, THEN ONLY
1725:                 ;  ONE OF THEM WILL GET THE DEADLOCK MESSAGE,
1726:                 ;  AND THIS IS PROBABLY A BUG.
    SCHEDU page# 0041 next  prev
1728: ; HERE WE SEE IF JOB CAN EVER FIT. IF SO, TRY TO COMPACT CORE TO GET HIM IN
1729: ; IF NOT, SCAN FOR SOMEBODY ELSE
1730: 
1731: SCNIN9: MOVEI DDB,SDEAD1        ; J MAY CONTAIN THE NUMBER OF THE LOWER HERE
1732:         ANDCAM DDB,JBTSTS(J)    ; TELL SOMEONE WE GOT HIM IN.
1733:         CAMLE TAC,CORTAL        ; ENOUGH FREE CORE TO EVENTUALLY
1734:                                 ;FIT IN CORE?
1735:         JRST SCNOUT             ;NO, SCAN FOR SOME JOB TO OUTPUT TO MAKE ROOM
1736:         PUSHJ PDP,CHKSHF        ;YES, CALL CORE SHUFFLER TO MOVE JOBS AROUND
1737:         SKIPN FORCE             ;REG 12/3/73 SHUFFLER CAN SET FORCE!
1738:         SKIPE SHFWAT            ; SHUFFLER WAITING FOR IO OR SPW?
1739:         POPJ PDP,               ; YES, GOODBYE
1740:         MOVE J,FIT              ; NO, SEE IF WE WILL FIT NOW
1741:         LDB TAC,IMGIN
1742:         CAMG TAC,BIGHOL
1743:         JRST INJOB
1744:         HGMAC   (2)
1745:         JRST SCNIN2
1746: 
1747: RESCNIN:
1748:         MOVEI DAT,ALLRUNSCAN
1749:         JSP PC,QSCAN
1750:         JRST NOFIT
1751:         MOVE DDB,JBTSTS(J)
1752:         TLNN DDB,SWP
1753:         JRST (QR)
1754:         LDB TAC,IMGIN
1755:         LDB DDB,PSEGN           ; SECOND SEGMENT NUMBER
1756:         JUMPE DDB,RESCN2
1757:         MOVE DSER,JBTSTS(DDB)
1758:         TLNN DSER,SWP
1759:         JRST RESCN2
1760:         LDB DSER,[POINT 8,JBTSWP(DDB),35]
1761:         ADD TAC,DSER
1762: RESCN2: CAMLE TAC,CORTAL
1763:         JRST (QR)
1764:         LDB TAC,IMGIN
1765:         JRST SCNIN1
    SCHEDU page# 0042 next  prev
1767: ; HERE WE HAVE DETECTED A CORE DEADLOCK
1768: 
1769: DEADLOCK:
1770:         MOVEI DDB,SDEADIN
1771:         TDNE DDB,JBTSTS(J)
1772:         POPJ P,                 ; WE KNOW ABOUT HIM
1773:         PUSH P,J
1774:         TRO DDB,SDEAD1          ;NOTE REALLY DEAD AT THIS TIME.
1775:         ORM DDB,JBTSTS(J)       ; MARK IT AS DETECTED
1776:         PUSHJ P,GCS
1777:         CAMLE DSER,CORMAX       ; IS HE TOO BIG ALTOGETHER, OR IS SOMEONE KEEPING HIM OUT
1778:         JRST DEADL2             ; TOO BIG ALTOGETHER.
1779:         PUSHJ P,HALFIN
1780:         JRST DEADL1
1781: 
1782: HALFIN: LSH J,=12               ; SOMEBODY'S FAULT. TELL HIM ABOUT IT.
1783:         ADD J,[XWD HALFD,=30*JIFSEC]
1784: PLANT:  CONO PI,PIOFF
1785:         IDPB J,CLOCK(PID)
1786:         CONO PI,PION
1787:         POPJ P,
1788: 
1789: DEADL2: PUSHJ P,DEACLN
1790: DEADL1: POP P,J
1791:         POPJ P,
1792: 
1793: DEACLN: LSH J,=12
1794:         ADD J,[XWD SDEAD,=15*JIFSEC]
1795:         JRST PLANT              ;GO PLANT IT
    SCHEDU page# 0043 next  prev
1797: ; CLOCK REQUEST TIMES OUT IN 15-SOME-ODD-SECONDS AND COMES HERE:
1798: 
1799: SDEAD:  MOVEI J,SDEADIN
1800:         ANDCAB J,JBTSTS(TAC)    ;CLEAR SDEADIN (NO MORE CLOCK REQUESTS).
1801:         TRNN J,SDEAD1           ;HAS HE BEEN IN SINCE DETECTION?
1802:         POPJ P,                 ;YES
1803:         MOVE J,TAC
1804:         PUSHJ P,GCS
1805:         CAMG DSER,CORMAX
1806:         POPJ P,
1807:         MOVM DDB,JOBQUE(J)      ; SEE IF HE HAS STOPPED HIS JOB
1808:         CAIN DDB,STOPQ
1809:         JRST DEACLN             ; YES, WE WILL GIVE HIM SOME TIME
1810:         PUSHJ P,FLUSIN          ;FLUSH FROM SWAP IN LIST
1811:         PUSH P,J
1812:         LDB J,PSEGN
1813:         SKIPE J
1814:         PUSHJ P,FLUSIN          ;ALSO UPPER
1815:         POP P,J
1816:         PUSHJ P,TTYERP          ; FIND HIS TTY FOR HIM
1817:         PUSHJ P,INLMES
1818:         ASCIZ /CORE DEADLOCK.
1819: 
1820: /
1821:         PUSHJ P,PRCRCC
1822:         PUSHJ P,TTYSTC
1823:         JRST STOP1
1824: 
1825: HALFD:  MOVE J,TAC
1826:         MOVM AC3,JOBQUE(J)
1827:         MOVE TAC,JBTSTS(J)
1828:         CAIE AC3,STOPQ          ;CLEAR BIT IF HE STOPPED HIMSELF
1829:         TRNN TAC,SDEAD1         ;HAS HE BEEN IN SINCE DETECTION?
1830:         JRST KILLIN
1831:         PUSHJ P,GCS
1832:         CAMG DSER,CORMAX
1833:         JRST HALFD1
1834:         PUSH P,J
1835:         JRST DEADL2
1836: HALFD1: PUSH P,DSER
1837:         PUSHJ P,GCMAX
1838:         POP P,DSER
1839:         CAMG DSER,AC3
1840:         JRST KILLIN
1841:         PUSHJ P,TTYERR                  ;THIS GUY ONLY SETS ERROR BIT
1842:                                         ;DOESN'T CLEAR INPUT UNLESS NECESSARY
1843:         PUSHJ P,INLMES
1844:         ASCIZ /
1845: YOU ARE LOCKED OUT OF CORE!
1846: /
1847:         MOVSI IOS,USRB
1848:         IORB IOS,DEVIOS(DDB)
1849:         PUSHJ P,TTYSTR
1850:         JRST HALFIN
1851: 
1852: KILLIN: MOVEI DDB,SDEADIN
1853:         ANDCAM DDB,JBTSTS(J)
1854:         POPJ P,
    SCHEDU page# 0044 next  prev
1856: ;       GCMAX - ROUTINE TO CALCULATE HOW MUCH CORE IS AVAILABLE FOR A
1857: ;       JOB ON THE DISK WHICH WANTS TO COME IN.  CORE IS CONSIDERED
1858: ;       TO BE AVAILABLE IF IT IS USER CORE NOT OCCUPIED BY SPW JOBS.
1859: 
1860: GCMAX:  SETZM   GCBITS                  ;72 BITS FOR REMEMBERING
1861:         SETZM   GCBITS+1
1862:         MOVE    AC3,SYSTOP              ;COMPUTE -(LOKTOP-SYSTOP)
1863:         SUB     AC3,LOKTOP              ;LOCKED CORE SIZE = LOKTOP-SYSTOP
1864:         ADD     AC3,CORMAX              ;ADD SIZE FROM SYSTOP TO MEMSIZ
1865:         SKIPG   SPWACT                  ;ANY ONE IN SPW MODE?
1866:         POPJ    P,                      ;NO. THIS IS SIMPLE
1867:         PUSH    P,DDB
1868:         PUSH    P,[POINT 6,SPWGO(JN),5] ;GET A BYTE POINTER
1869:         PUSHJ   P,GCLP                  ;CALL THINK ABOUT P1 SPW JOBS
1870:         MOVE    DSER,[POINT 6,SP2GO(JN),5];GET ANOTHER BYTE POINTER
1871:         MOVEM   DSER,(P)                ;STUFF IT WHERE GCLP WILL SEE IT
1872:         PUSHJ   P,GCLP
1873:         SUB     P,[1,,1]                ;ADJUST STACK(A LESS USEFUL COMMENT-FW)
1874:         POP     P,DDB
1875:         POPJ    P,
1876: 
1877: GCLP:   MOVEI   JN,0                    ;INITIALLY LOOK AT LIST BASE
1878: GCLP1:  LDB     JN,-1(P)                ;GET NUMBER OF SOME SPW JOB.
1879:         JUMPE   JN,CPOPJ                ;0 MEANS END OF LIST.
1880:         SKIPN   JBTST2(JN)              ;SKIP IF SPACEWAR IS ACTIVE
1881:         JRST    GCLP1                   ;NOT STILL ACTIVE
1882:         MOVEI   DDB,(JN)                ;GET JOB NUMBER INTO DDB
1883:         PUSHJ   P,GCMCK                 ;HAVE WE SEEN THIS JOB BEFORE?
1884:         JRST    GCLP1                   ;YES. DON'T COUNT AGAIN
1885:         MOVEM   IOS,GCBITS(DSER)        ;SO WE WON'T COUNT THIS JOB AGAIN
1886:         MOVE    DDB,JBTSTS(JN)  
1887:         TRNE    DDB,JLOCK               ;IS THIS JOB LOCKED IN?
1888:         JRST    GCLP2                   ;YES. DON'T COUNT IT TWICE
1889:         HLRZ    DSER,JBTADR(JN)         ;GET THE PROTECTION
1890:         SUBI    AC3,1(DSER)             ;DECREASE THE AVAILABLE SIZE.
1891: GCLP2:  ANDI    DDB,77                  ;SEGMENT NUMBER FROM JBTSTS
1892:         JUMPE   DDB,GCLP1               ;LOOP IF NO SEGMENT
1893:         PUSHJ   P,GCMCK                 ;SEGMENT SEEN BEFORE?
1894:         JRST    GCLP1                   ;YES. DON'T DO IT AGAIN.
1895:         MOVEM   IOS,GCBITS(DSER)        ;DON'T COUNT THIS SEGMENT AGAIN
1896:         HLRZ    DDB,JBTADR(DDB)         ;GET THE PROTECTION SIZE
1897:         SUBI    AC3,1(DDB)
1898:         JRST    GCLP1                   ;LOOP
1899: 
1900: ;JOB NUMBER IN DDB. SKIP IF WE'VE NOT SEEN THIS JOB BEFORE.
1901: ;IOS IS SET WITH WORD TO DEPOSIT IF YOU WANT TO MARK THIS JOB AS SEEN:
1902: ; USE   MOVEM   IOS,GCBITS(DSER)        TO REMEMBER HAVING SEEN THIS JOB.
1903: GCMCK:  MOVE    DSER,DDB
1904:         ANDI    DSER,1          ;THIS BIT WILL INDEX THE TWO WORD BIT TABLE
1905:         MOVEI   IOS,1           ;THIS BIT WILL BE SHIFTED TO UNIQUE POSITION
1906:         ROT     DDB,-1
1907:         ROT     IOS,-=16(DDB)   ;
1908:         ROT     DDB,1           ;RESTORE DDB
1909:         IOR     IOS,GCBITS(DSER);TURN ON OTHER JOB BITS WE HAVE SEEN AND SET
1910:         CAME    IOS,GCBITS(DSER);IS THIS AN OLD JOB NUMBER?
1911:         AOS     (P)             ;  NO, SKIP RETURN
1912:         POPJ    P,              ;  YES, NORMAL RETURN
1913: 
1914: 
1915: GCS:    MOVE TAC1,J
1916:         PUSHJ P,CORSGT          ; ADD UP HIS CORE SIZE AND SEE IF WE ARE STILL DEADLOCKED
1917:         MOVE DSER,TAC1
1918:         LDB TAC1,PSEGN
1919:         MOVE DDB,TAC1
1920:         JUMPE TAC1,CPOPJ
1921:         PUSHJ P,CORSGT
1922:         ADD DSER,TAC1
1923:         POPJ P,
1924: 
    SCHEDU page# 0045 next  prev
1926: ;SCAN FOR OUTPUT
1927: 
1928: SCNOUT: HGMAC(3)
1929: ;(CODE TO LOOK FOR EXPANDING JOBS HAS BEEN MOVED TO SCNIN)
1930:         MOVE DDB,CORTAL         ;INITIALIZE FREE CORE COUNTER
1931:         MOVEM DDB,SUMCOR
1932:         SETZM MAXSIZ            ;CLEAR SIZE OF LARGEST JOB
1933:         SETZM MAXJBN
1934:         SETZM MAXRSZ
1935:         SETZM MAXRJB
1936:         SETZM MAXSSZ
1937:         SETZM MAXSJB
1938:         MOVE TAC,[XWD NJOBS,CJOBS]
1939:         BLT TAC,CJOBS+JOBN-1    ; MOVE OVER TABLE OF REFERENCE COUNTS
1940:         MOVE DDB,FIT            ;ENOUGH SEEN YET?
1941:         LDB DSER,[POINT 6,JBTSTS(DDB),35]
1942:         JUMPE DSER,FORCE3
1943:         MOVE UCHN,JBTSTS(DSER)
1944:         TLNE UCHN,SWP
1945:         LDB DSER,[POINT 8,JBTSWP(DSER),35]
1946:         TLNN UCHN,SWP           ; OR IS HE SWAPPED IN?
1947:         SETZ DSER,              ; YES, HE DOESN'T COUNT INTO CORE WE HAVE TO GET
1948: FORCE3: LDB DDB,IMGINT
1949:         ADD DDB,DSER            ; ADD IN SIZE OF UPPER
1950:         MOVEM DDB,NEEDED        ; AND STORE AS AMOUNT NEEDED
1951:         MOVEI DAT,OSCAN         ;NO--SCAN QS
1952:         JSP PC,QSCAN
1953:         JRST RESCNIN
1954:         CAME J,FIT              ; REACHED OURSELVES YET?
1955:         JRST SCNOF1             ; NO.
1956:         SKIPN JBTSIN(J)         ; GIVE HIGH PRIORITY TO GUYS IN SWAP IN LIST
1957:         CAMN J,SEGWAIT          ; IS THIS GUY WAITING FOR A SEGMENT?
1958:         JRST (QR)               ; YES, EXCEPT FOR US, SCAN BACK ALL THE WAY
1959:         JRST RESCNIN            ; NO, SCAN FOR MORE INPUT
1960: 
1961: SCNOF1: MOVE DDB,JBTSTS(J)      ;GET JOB STATUS BITS
1962:         TLNE    DDB,SWP         ;NO, IS JOB ON DISK OR ON ITS WAY?
1963:         JRST    CJOB            ;YES,CONTINUE SCAN TO FIND ANOTHER JOB TO OUTPUT
1964:         TLNE DDB,JHLDIN         ;SOMEONE TRYING TO KEEP THIS GUY IN?
1965:         JRST (QR)               ;YES, SKIP HIM
1966:         TLNE    DDB,JSEG        ;SEGMENT?
1967:         JRST    FRCE4A          ;YES. CHECK NJOBS TO SEE IF IT SHOULD BE SWAPPED
1968:         TRNE    DDB,JLOCK       ;LOCKED JOB?
1969:         JRST    (QR)            ;YES. CAN'T BE SWAPPED.
1970:         CAME    J,SEGWAIT       ;DON'T SWAP OUT IF WAITING FOR A HIGH SEGMENT
1971:         CAMN    J,LOCKNO
1972:         JRST    (QR)            ;DON'T SWAP OUT THE GUY WE'RE TRYING TO LOCK IN.
1973: 
1974: REPEAT 0,<              ;LET'S TRY NOT CLOGGING UP CORE WITH LOW PRIORITY LOSERS
1975:         MOVM DDB,JOBQUE(J)      ; PICK UP HIS QUEUE
1976:         CAIE DDB,TQ             ; IS HE IN A RUN QUEUE?
1977:         CAIN DDB,RUNQ
1978:         CAIA
1979:         JRST FORCE4
1980:         LDB DDB,PSEGN           ; YES, DOES HE HAVE AN UPPER?
1981:         JUMPE DDB,FORCE5        ; NO
1982:         MOVE DDB,JBTSTS(DDB)    ; YES, IS IT IN CORE?
1983:         TLNE DDB,SWP
1984:         JRST FORCE4             ; NO, DOESN'T MATTER
1985: FORCE5: SKIPN STIME(J)          ; HAS THIS JOB BEEN RUN?
1986:         JRST (QR)               ; NO, GO BACK AND LET IT RUN.
1987: >
    SCHEDU page# 0046 next  prev
1989: FORCE4: CAME J,SEGWAIT          ; IF WAITING FOR SEGMENT, MUST STAY IN
1990:         SKIPE JBTST2(J)         ; DOES HE HAVE A SPACEWAR MODULE?
1991:         JRST (QR)               ;YES. CANT SWAP HIM OUT.
1992:         HLRZ DDB,JBTDAT(J)      ;PICK UP SIZE OF JOB
1993:         JUMPE DDB,(QR)
1994:         PUSHJ P,SIZCHK          ;UPDATE SUMCOR AND CHECK IF ENOUGH YET
1995:         JRST CJOB               ;NO. LOOK FOR MORE
1996: FORCE6: SKIPN J,MAXJBN          ;YES, SWAP OUT LARGEST
1997:         MOVE J,MAXRJB
1998:         JUMPN J,FORCE0
1999:         MOVE J,MAXSJB           ;AS A LAST RESORT, SWAP SEGMENT
2000: FORCE0: MOVSI DDB,SWP
2001:         IORM DDB,JBTSTS(J)
2002:         MOVEM J,FORCE           ;ASSUME NOT SWAPPABLE--IS IT?
2003: 
2004: FORCE1:
2005: IFN JDMPRG,<
2006:         MOVE JDAT,JBTDAT(J)
2007: >
2008:         SKIPN PROG,JBTADR(J)    ;LOC. IN PHYSICAL CORE, IS CORE
2009:                                 ;ASSIGNED IN MEMORY?
2010:         JRST OUTJOB             ;NO, CANNOT HAVE ACTIVE DEVICES
2011:         CAME J,JOB(PID)         ;IF THIS IS CURRENT JOB, WAIT UNTIL
2012:                                 ;PROTECTED AREA IS MOVED BACK TO JOB DATA AREA
2013:         PUSHJ PDP,ANYACT        ;ANY ACTIVE DEVICES?
2014:         POPJ PDP,               ;YES--RETURN AND WAIT FOR I/O TO STOP.
2015:         SKIPN DDB,SEGWAIT       ; IS ANYONE WAITING FOR A SEGMENT?
2016:         JRST OUTJOB             ; NO
2017:         LDB TAC,[POINT 6,JBTSTS(DDB),35]
2018:         CAIE TAC,(J)            ; YES, IS IT US?
2019:         JRST OUTJOB             ; NO
2020:         MOVSI TAC,SWP           ; YES, WE ARE NO LONGER SWAPPABLE
2021:         ANDCAM TAC,JBTSTS(J)
2022:         SETZM FORCE
2023:         SETZM SWPCNT            ; BE SURE AND SCAN AGAIN NEXT TICK
2024:         POPJ P,
2025: 
2026: FRCE4A: SKIPE   NJOBS(J)        ;ANYONE LEFT USING THIS?
2027:         JRST    (QR)            ;YES. SEGMENT SWAP OUT WILL BE CONSIDERED W/LOWERS
2028:         JRST    FORCE4          ;THIS MAY BE A DETACHED SEGMENT. SWAP IT
    SCHEDU page# 0047 next  prev
2030: ;OUTPUT A JOB
2031: 
2032: OUTJOB: HGMAC(4)
2033:         MOVNM J,FINISH          ;SET FINISH FLAG FOR OUTJOB
2034:         AOS NOUTSWPS
2035:         SETZM FORCE             ;CLEAR FORCE FLAG
2036:         PUSHJ P,QNORUN          ; REQUE HI SEGMENT IF NECESSARY
2037:         SETZM FIRSTOUT#
2038:         MOVSI DDB,INTSWW
2039:         TDNN DDB,JBTIEN(J)
2040:         JRST OUTJO1
2041:         IORM DDB,JBTIRQ(J)
2042:         PUSHJ P,INTRUN
2043:         MOVM J,FINISH
2044: OUTJO1: HLRZ    DDB,JBTADR(J)   ;COMPUTE CORE IMAGE SIZE
2045:         JUMPE   DDB,SWP5        ;DONT OUTPUT IF 0 CORE
2046: ;HERE WE SAVE THE JOB DATA AREA OF A LOWER
2047:         MOVE    TAC1,JBTSTS(J)  ;GET STATUS
2048:         SKIPE   JBTPDL(J)       ;DON'T SAVE IF THERE'S NO PLACE.
2049:         TLNE    TAC1,JSEG       ;IS THIS A SEGMENT?
2050:         JRST    OUTJO3          ;YES. THERE IS NOTHING TO SAVE.
2051:         HRLZ    TAC1,JBTDAT(J)  ;SOURCE (SORT OF)
2052:         HRR     TAC1,JBTPDL(J)  ;DESTINATION (SORT OF)
2053:         ADD     TAC1,[JOBPRT,,<JBTPLN+JOBPRT-JOBPFI>]
2054:         HRRZ    DAT,JBTPDL(J)   ;
2055:         BLT     TAC1,JBTPLN(DAT);SAVE THE DATA.
2056:         MOVEI   TAC1,SAVJDA
2057:         IORM    TAC1,JBTSTS(J)  ;DATA AREA IS NOW SAVED IN CORE.
2058: OUTJO3: HRRZ    TAC1,JBTADR(J)  ;LOCATION OF CORE IMAGE
2059:         MOVNM   DDB,TAC         ;*SAVE COUNT FOR CALL TO SQOUT. -(SIZE-1)
2060:         ASH     DDB,-=10        ;CONVERT TO 1K BLOCKS
2061:         ADDI    DDB,1
2062:         DPB     DDB,IMGOUT      ;RECORD AS OUT IMAGE
2063:         SKIPN   XPANDF          ;DONT SET IMGIN IF FROM XPAND1
2064:         DPB     DDB,IMGIN
2065:         SKIPE   STIME(J)        ;HAS HIS CORE IMAGE BEEN MODIFIED?
2066:         JRST    OUTJ1           ;YES.
2067:         HLRZ    DDB,JBTSWP(J)   ;SEE IF HE HAS BEEN SWAPPED OUT BEFORE
2068:         JUMPN   DDB,OUTP1       ;WAS SWAPPED OUT BEFORE.
2069:         LDB     DDB,IMGOUT      ;FIX DDB FOR CALL ON OUTJ1
2070: 
2071: ; WE HAVE DECIDED THAT JOB IS REALLY TO BE SWAPPED
2072: ; CALL THE OUTPUT ROUTINE.
2073: ;DDB = IMGOUT SIZE. TAC1=LOCATION OF JOB. TAC = -(SIZE-1)
2074: 
2075: OUTJ1:  SKIPN   BLTSWP          ;ARE WE DOING BLT AFTER SWAPIN?
2076:         JRST    OUTJ2           ;NO. THEN NO BLT BEFORE SWAP OUT.
2077:         HRL     TAC1,TAC1       ;LOCATION,,LOCATION
2078:         HLRZ    DAT,JBTADR(J)   ;GET THE SIZE
2079:         ADDI    DAT,(TAC1)      ;COMPUTE ENDING ADDRESS
2080:         BLT     TAC1,(DAT)      ;BLT TO SELF.
2081:         HRRZ    TAC1,JBTADR(J)  ;RESTORE TAC1.
2082:         
2083: OUTJ2:  HRLI    TAC1,-1(TAC)    ;*BUILD AND SAVE IOWD FOR SQOUT
2084:         PUSH    P,TAC1          ;*
2085:         MOVE    DAT,DDB         ;*CONVERT CORE IMAGE TO 128 WD BLOCKS
2086:         PUSHJ   P,GXSAT         ;*GET DEVICE STORAGE
2087:         JRST    FULL            ;*NONE AVAILABLE
2088:         SKIPN   FBACT
2089:         HRLM    TAC,JBTSWP(J)   ;*SAVE DEVICE ADDRESS
2090:         POP     P,TAC1          ;*GET IOWD
2091:         JRST    SQOUT           ;*START OUTPUT AND RETURN
2092: 
2093: SWP5:
2094:         DPB DDB,IMGOUT          ;SET OUTPUT IMAGE TO 0
2095:         JRST SWAPSCAN           ;GO LOOK FOR SOMETHING ELSE TO DO
2096: 
2097: NOFIT:  SETZM FIT               ;FORGET ABOUT FITTING IN A JOB ON DISK
2098:         POPJ PDP,               ;ALL JOBS IN CORE ARE HIGHER PRIORITY.
    SCHEDU page# 0048 next  prev
2100: ; ROUTINE TO ADD THIS JOB'S SIZE TO CURRENT TOTAL AND SEE IF WE
2101: ; HAVE MADE ENOUGH ROOM FOR THE JOB WE ARE TRYING TO FIT IN
2102: ; EXPECTS RELOCATION IN DDB, JOB NUMBER IN J
2103: 
2104: SIZCHK: ASH DDB,-12             ;CONVERT TO 1K BLOCKS
2105:         ADDI DDB,1
2106:         MOVE TAC,JBTSTS(J)
2107:         TLNE TAC,JSEG
2108:         JRST SETMRS
2109:         MOVM TAC,JOBQUE(J)      ; IS HE RUNNABLE?
2110:         CAIE TAC,TQ
2111:         CAIN TAC,RUNQ
2112:         JRST SETMRJ             ; YES, GET SEPARATE MAXIMUM.
2113:         CAMG DDB,MAXSIZ         ;LARGEST SO FAR?
2114:         JRST FORCE2             ;NO
2115:         MOVEM DDB,MAXSIZ        ;YES, SAVE SIZE
2116:         MOVEM J,MAXJBN          ;AND JOB NUMBER
2117: FORCE2: ADDB DDB,SUMCOR         ;ADD TO TOTAL
2118:         CAML DDB,NEEDED         ;IS IT WHAT WE NEEDED
2119:         AOS (P)                 ;YES
2120:         POPJ P,
2121: 
2122: SETMRS: CAMG DDB,MAXSSZ
2123:         JRST FORCE2
2124:         MOVEM DDB,MAXSSZ
2125:         MOVEM J,MAXSJB
2126:         JRST FORCE2
2127: 
2128: SETMRJ: CAMG DDB,MAXRSZ
2129:         JRST FORCE2
2130:         MOVEM DDB,MAXRSZ
2131:         MOVEM J,MAXRJB
2132:         JRST FORCE2
    SCHEDU page# 0049 next  prev
2134: ; ROUTINE TO DECREMENT REFERENCE TO THIS JOB'S UPPER, IF ANY
2135: ; IF ALL REFERENCES HAVE BEEN SELECTED FOR SWAPOUT, THEN ADD
2136: ; IN THE UPPER SIZE TOO.
2137: 
2138: CJOB:   LDB DDB,PSEGN           ; PICK UP NUMBER OF UPPER
2139:         JUMPE DDB,(QR)
2140:         MOVE TAC,JBTSTS(DDB)    ; IS UPPER IN CORE?
2141:         SOSN CJOBS(DDB)         ; DECREMENT REFERENCE COUNT
2142:         TLNE TAC,SWP
2143:         JRST (QR)
2144:         PUSH P,J
2145:         MOVE J,DDB
2146:         HLRZ DDB,JBTADR(J)
2147:         JUMPE DDB,CJBXIT
2148:         PUSHJ P,SIZCHK          ; UPDATE SUMCOR AND CHECK IF ENOUGH YET
2149:         JRST CJBXIT             ; NO, KEEP LOOKING
2150:         SUB P,[XWD 1,1]         ; YES, SWAP OUT LARGEST
2151:         JRST FORCE6
2152: 
2153: CJBXIT: POP P,J
2154:         JRST (QR)
    SCHEDU page# 0050 next  prev
2156: ; ALL SWAP RETURNS THROUGH HERE
2157: 
2158: SWPXIT: SKIPN FIT               ; ARE WE FITTING SOMEBODY?
2159:         SKIPE FORCE             ; OR PERHAPS FORCING SOMEONE?
2160:         SETZM SWPCNT            ; IF SO, FIRE UP SWAPPER SOMETIME
2161:         POPJ P,
2162: 
2163: FULL:   POP PDP,TAC
2164:         SOSL FULCNT             ;PRINT MESSAGE EVERY 30 SECONDS
2165:         POPJ PDP,
2166:         MOVEI TAC,=30*JIFSEC
2167:         MOVEM TAC,FULCNT
2168:         JSP TAC,ERRPNT
2169:         ASCIZ /SWAPPING DEVICE FULL/
2170:         JRST EXCALP
    SCHEDU page# 0051 next  prev
2172: ;INPUT A JOB
2173: 
2174: INJOB:  HGMAC(5)
2175:         MOVEM J,FINISH          ;SET FINISH FLAG TO INJOB
2176:         AOS NINSWPS
2177:         SETZM FIRSTOUT
2178:         SETZM FIT               ;CLEAR FIT FLAG
2179:         LSH TAC,=10
2180:         SUBI TAC,1
2181:         SETZB JDAT,PROG         ;NO CORE NOW
2182:         PUSHJ PDP,CORGET
2183:         JRST INJO3              ; NOT AVAILABLE, FREE STORAGE SYSTEM MUST HAVE SNUK IN. RESCAN FOR INPUT.
2184: INJO1:  LDB DDB,IMGOUT          ;GET OUTPUT IMAGE
2185:         JUMPE DDB,FININ1        ;DONT INPUT IF OUT IMAGE IS 0
2186:         LDB TAC,IMGIN           ;GET IN-CORE SIZE.
2187:         CAML DDB,TAC            ;SMALLER THAN OUT?
2188:         MOVE DDB,TAC            ;YES. READ ONLY WHAT WILL FIT.
2189:         LSH DDB,=18+=10         ;*BUILD IOWD FOR SQIN
2190:         MOVN TAC1,DDB           ;*
2191:         HRR TAC1,JBTADR(J)      ;*
2192:         HLRZ TAC,JBTSWP(J)      ;*GET DEVICE ADDRESS
2193:         JRST SQIN               ;*START INPUT
2194: 
2195: INJO3:  SETZM FINISH
2196:         SKIPN SHFWAT
2197:         JRST SWP2
2198:         SETZM SWPCNT
2199:         POPJ P,
    SCHEDU page# 0052 next  prev
2201: ;XPAND SETS CONDITIONS TO GET MORE CORE FOR A JOB BY SWAPPING IT OUT
2202: ;THEN BACK IN TO DESIRED AMOUNT.
2203: ;JOBS POSITION IN QS NOT AFFECTED.
2204: ;CALL:
2205: ;       MOVE J,[JOB NO.]
2206: ;       MOVE TAC,[HIGHEST LEGAL ADDRESS DESIRED]
2207: ;       PUSHJ P,XPAND
2208: 
2209: XPAND: PUSH P,DDB
2210:         MOVE DDB,TAC            ;ADDRESS TO 1K BLOCKS
2211:         ROT DDB,-=10
2212:         ADDI DDB,1
2213:         DPB DDB,IMGIN
2214: IFN FTSTAT,<
2215:         EXCH TAC,DDB
2216:         LSH TAC,6
2217:         ANDI TAC,37700
2218:         TRO TAC,CSZSTA
2219:         PUSHJ P,STAPUT
2220:         MOVE TAC,DDB
2221: >;FTSTAT
2222:         HLRZ DDB,JBTADR(J)
2223:         JUMPE DDB,XPAND4        ;ANY CORE IN MEMORY NOW? (NORMAL XPAND)
2224:         SKIPE   XJOB(J)         ;EXPAND FLAG ALREADY SET?
2225:         JRST    XPAND3          ;YES.  DONT INCREASE XJOB COUNT.
2226:         SETOM   XJOB(J)         ;SET EXPAND FLAG
2227:         AOS     XJOB            ;INCREASE COUNT OF JOBS TO EXPAND.
2228: XPAND3: POP P,DDB
2229:         SETZM SWPCNT
2230:         POPJ P,
2231: 
2232: XPAND4: DPB DDB,IMGOUT          ;CLEAR IMGOUT NOW
2233:         MOVSI DDB,SWP
2234:         IORM DDB,JBTSTS(J)      ;AND MARK AS SWAPPED OUT
2235:         JRST XPAND3
2236: 
2237: ;XPAND1 COMPLETES ACTION REQUESTED BY XPAND.
2238: ;CALLED WHEN NO INPUT TO DO OR ON SEARCH FOR OUTPUT.
2239: 
2240: XPAND1: SKIPN   XJOB            ;ANY JOBS TO EXPAND?
2241:         POPJ    P,              ;NO.
2242:         MOVEI   J,JOBN          ;SCAN FOR EXPANDING JOBS.
2243:         SKIPN   XJOB(J)         ;THIS JOB NEED TO EXPAND?
2244:         SOJG    J,.-1
2245:         SETZM   XJOB(J)         ;CLEAR THIS JOB.
2246:         JUMPE   J,XPAND2        ;LOSE!
2247:         SOS     XJOB            ;REDUCE THE COUNT.
2248:         SETOM XPANDF            ;SET FLAG SO IMGIN WONT BE RESET
2249:         SETZM   SWPCNT
2250:         JRST FORCE0             ;GO START OUTPUT
2251: 
2252: XPAND2: PUSHACS
2253:         PUSHJ P,DISDATE
2254:         PUSHJ P,DISMES
2255:         ASCIZ /ππXJOB SET BUT NO JOB EXPANDING
2256: /
2257:         POPACS
2258:         POPJ P,
    SCHEDU page# 0053 next  prev
2260: SUBTTL  SWPSER  4 AUG 67
2261: 
2262: ;PUT A REQUEST IN THE SWAPPING QUEUE. ENTER AT SQIN FOR
2263: ;       INPUT, SWOUT FOR OUTPUT
2264: ;CALL:  MOVE TAC1,XWD -NO. OF WORDS,FIRST CORE LOC.
2265: ;       HRRZ TAC,DISK BLOCK NO.
2266: ;       PUSHJ PDP,SQIN/SQOUT
2267: ;       RETURN HERE ALWAYS
2268: ;       CONTENTS OF TAC,TAC1 LOST
2269: 
2270: SQIN:
2271:         SKIPE FBACT
2272:         JRST FBIN
2273:         TLO TAC,400000          ;SET READ INDICATOR
2274: SQOUT:
2275:         SKIPE FBACT
2276:         JRST FBOUT
2277:         MOVEM TAC,SERA          ;STORE THE BLOCK NUMBER
2278:         MOVEM TAC1,SQREQ        ;STORE THE IOWD
2279:         MOVNI TAC,1             ;IS THE DEVICE BUSY?
2280:         EXCH TAC,DFBUSY
2281:         JUMPN TAC,CPOPJ         ;YES IF JUMP
2282: 
2283: 
2284: ERATRY←←3       ;NO. OF TIMES TO READ AND WRITE ON ERRORS
2285: 
2286: ;START UP DEVICE WITH SWAPPING REQUEST.
2287: ;IF A SWAPPER REQUEST IS WAITING(SQREQ WILL BE NON-ZERO)
2288: 
2289:         MOVEI TAC1,ERATRY
2290:         MOVEM TAC1,SERACT
2291:         MOVE TAC1,SQREQ         ;*PUT IOWD INTO TAC1
2292:         MOVSI TAC,200000        ;*SET "SWAPPER I/O GOING" FLAG ON
2293:         ORB TAC,SERA            ;*
2294:         MOVM ITEM,FINISH        ; PICK UP JOB NUMBER FOR OUTPUT
2295:         HRROS ITEM              ; MAKE LH NEG TO FLAG SWAP OPERATION
2296:         TLZE TAC,400000         ;*IS THIS JOB A READ?
2297:         SOJA TAC1,DFRED         ;*YES  -CALL DSKSER
2298:         SOJA TAC1,DFWRT         ;*NO, WRITE.
    SCHEDU page# 0054 next  prev
2300: ; FAST-BAND SWAPPER . .  .
2301: 
2302: FBOUT:  MOVE DAT,[XWD J,JBTSWP]
2303:         MOVEI DSER,MAXFB
2304: FBOREQ: HLRZ UCHN,@DAT  ; PICK UP SWAPPING BAND NUMBER
2305:         JUMPN UCHN,FBOUT1
2306:         MOVEI UCHN,(DSER)
2307:         JRST FBOUT3
2308: FBOUT1: HLRO DDB,TAC1
2309:         MOVNS DDB
2310:         SUBI DDB,1
2311:         IDIVI DDB,=76*2000
2312:         ADDI DDB,(DSER)
2313:         CAMN DDB,UCHN
2314:         JRST FBOUT6
2315:         CAMG UCHN,DDB
2316:         JRST FBOUT2
2317:         PUSHJ P,FBGIVE          ; TOO MANY BANDS. GIVE SURPLUS BACK.
2318:         SUBI UCHN,1
2319:         HRLM UCHN,@DAT
2320:         JRST FBOUT1
2321: 
2322: FBOUT2: ADDI UCHN,1             ; NOT ENOUGH. GET MORE BANDS.
2323: FBOUT3: PUSHJ P,FBGET
2324:         JRST FBOUT7
2325:         HRLM UCHN,@DAT
2326:         JRST FBOUT1
2327: 
2328: FBOUT7: MOVEM TAC1,DIOWD#
2329:         MOVE TAC,[XWD FBCLK,1]
2330:         CONO PI,PIOFF
2331:         IDPB TAC,CLOCK
2332:         CONO PI,PION
2333:         POPJ P,
2334: 
2335: FBCLK:  MOVM J,FINISH
2336:         MOVE TAC1,DIOWD
2337:         JRST FBOUT
    SCHEDU page# 0055 next  prev
2339: ; HERE WE HAVE ENOUGH BANDS, SET UP CALL
2340: 
2341: FBOUT6: MOVEI UCHN,(DSER)
2342:         HRRZ TAC,TAC1
2343:         HLRO AC2,TAC1
2344:         MOVNS AC2
2345:         SETZM TAC1
2346:         SETOM SWPBSY#
2347:         SETZM SERA
2348: FBOUT4: CAIG AC2,=76*2000
2349:         JRST FBOUT5
2350:         PUSH P,TAC
2351:         PUSH P,AC2
2352:         PUSH P,DSER
2353:         PUSH P,DAT
2354:         MOVEI AC2,=76*2000
2355:         MOVSI DAT,DONE1
2356:         PUSHJ P,FBWRITE
2357:         JRST FBERR1
2358:         POP P,DAT
2359:         POP P,DSER
2360:         POP P,AC2
2361:         POP P,TAC
2362:         ADDI TAC,=76*2000
2363:         SUBI AC2,=76*2000
2364:         ADDI UCHN,1
2365:         JRST FBOUT4
2366: 
2367: FBERR1: POP P,DAT
2368:         POP P,DSER
2369:         POP P,AC2
2370:         POP P,TAC
2371:         JRST FBERR
2372: 
2373: FBOUT5: MOVSI DAT,DONE
2374:         PUSHJ P,FBWRITE
2375:         JRST FBERR
2376:         POPJ P,
2377: 
2378: DONE:   SETZM SWPCNT
2379:         SETZM SWPBSY
2380: DONE1:  HRRZM DAT,SERA
2381:         POPJ P,
    SCHEDU page# 0056 next  prev
2383: ; LIBRASCOPE INPUT ROUTINE
2384: 
2385: FBIN:   MOVE DAT,[XWD J,JBTSWP]
2386:         MOVEI DSER,MAXFB
2387: FBIREQ: HLRZ UCHN,@DAT
2388:         HLRO DDB,TAC1
2389:         MOVNS DDB
2390:         SUBI DDB,1
2391:         IDIVI DDB,=76*2000
2392:         ADDI DDB,(DSER)
2393:         CAMGE UCHN,DDB
2394:         JRST FBINA
2395:         MOVEI UCHN,(DSER)
2396:         HRRZ TAC,TAC1
2397:         HLRO AC2,TAC1
2398:         MOVNS AC2
2399:         SETZM TAC1
2400:         SETOM SWPBSY
2401:         SETZM SERA
2402: FBIN2:  CAIG AC2,=76*2000
2403:         JRST FBIN1
2404:         PUSH P,TAC
2405:         PUSH P,AC2
2406:         PUSH P,DSER
2407:         PUSH P,DAT
2408:         MOVEI AC2,=76*2000
2409:         MOVSI DAT,DONE1
2410:         PUSHJ P,FBREAD
2411:         JRST FBERR1
2412:         POP P,DAT
2413:         POP P,DSER
2414:         POP P,AC2
2415:         POP P,TAC
2416:         ADDI TAC,=76*2000
2417:         SUBI AC2,=76*2000
2418:         ADDI UCHN,1
2419:         JRST FBIN2
2420: 
2421: FBIN1:  MOVSI DAT,DONE
2422:         PUSHJ P,FBREAD
2423:         JRST FBERR
2424:         POPJ P,
    SCHEDU page# 0057 next  prev
2426: ; LIBRASCOPE SWAPPING ERROR ROUTINES
2427: 
2428: FBERR:  SETZM SWPCNT
2429:         SETZM SWPBSY
2430:         SETOM SERA
2431:         JRST FINSWP
2432: 
2433: FBINA:  JUMPE UCHN,FBINB
2434:         SUBI UCHN,(DSER)-1
2435:         MOVNI DDB,=76*2000
2436:         IMULI DDB,(UCHN)
2437:         HRL TAC1,DDB
2438:         JRST FBIN
2439: 
2440: FBINB:  PUSHACS
2441:         PUSHJ P,DISDATE
2442:         PUSHJ P,DISERR
2443:         [ASCIZ/SWAP REQUEST WITH NO BANDS.
2444: J=/]
2445:         DISARG(DCP,<-20+J(P)>)
2446:         [ASCIZ/
2447: /]
2448:         -1
2449:         POPACS
2450:         JRST FBERR      ;ERROR OUT
    SCHEDU page# 0058 next  prev
2452: ;FIND A SERIES OF BLOCKS ON THE DISK TO SWAP ONTO. CALLED
2453: ;AT CLOCK LEVEL.
2454: ;CALL:  MOVEI DAT,NO. OF 1K BLOCKS DESIRED
2455: ;       PUSHJ PDP,GXSAT
2456: ;       ERROR EXIT      (DISK IS FULL)
2457: ;       NORMAL EXIT     ;C(TAC) = BLOCK NO.
2458: 
2459: ;CONTENTS OF ACS TAC,TAC1,DAT WILL BE LOST.
2460: 
2461: 
2462: 
2463: GXSAT:
2464:         SETZM TAC
2465:         SKIPE FBACT
2466:         JRST CPOPJ1
2467:         MOVE TAC,ITEM   ;PUT IT ON BAND NUMBER;JS
2468:         IMULI TAC,1140  ;CORRESPONDING TO ITS JOB NUMBER
2469:         AOS (PDP)       ;ALWAYS GIVE OK RETURN
2470: FXSAT: POPJ PDP,       ;DONT NEED FXSAT
2471: 
2472: SWPINI: SETZM SWPBSY
2473:         SETZM SWPCNT
2474:         SETZM FIT
2475:         SETZM FORCE
2476:         SETZM FINISH
2477:         SETZM SERA
2478:         POPJ PDP,
2479: 
2480: >
2481:         BEND SCHEDU
 EOF: SCHEDU end-of-file. cnt=57